WPF перекрасить вопрос - PullRequest
16 голосов
/ 11 мая 2011

У меня возникла проблема с перерисовкой моего элемента управления WPF.

Элемент управления WPF добавлен как элемент ElementHost.Child для формы Windows.

Когда Windows 7 переходит в режим энергосбережения и возвращается в нормальное состояние (путем перемещения мыши или нажатия клавиши на клавиатуре), остальные элементы управления формой Windows перекрашиваются, однако часть WPF не перерисовывается (и фон Win 7 виден в этой области).

При свернутом и развернутом приложении часть WPF перекрашивается.

Кто-нибудь имеет представление об этой проблеме?

Ответы [ 2 ]

1 голос
/ 18 июня 2011

Решение этой проблемы было предоставлено в журнале MSDN некоторое время назад.Он показывает, как вы можете сделать свои приложения WPF «осведомленными о питании», т.е. реагировать на уведомления о питании.Это удивительная статья, которую нужно обязательно прочитать.

Проверьте эту ссылку: Сделайте свои WPF-приложения максимально энергоэффективными

Вы можете просмотреть исходный код в Интернете или загрузить его.это отсюда: Код для PowerAware

Используемые технологии:

  • WPF
  • .Net Framework 3.0
  • Windows Vista/ Windows XP
0 голосов
/ 15 сентября 2011

Как правило, в формах Windows вызов .Invalidate () для элемента управления заставит его перерисовать себя (установив для прямоугольника проверки всего элемента управления значение «грязный», а затем разрешив ему асинхронно вызывать собственное событие рисования. - Если вы простовызовите метод Paint в winforms без Сначала сделав недействительной, вы сможете перерисовать только ту часть, которая ранее была помечена как грязная - поскольку окна используют подход Dirty Rectangles для сохранения при перерисовкевремя.)

Надеемся, что вы можете либо вызвать .Invalidate () на вашем элементе управления WPF, либо просто вызвать .Invalidate () в самой форме (например, "this.Invalidate ();")

Включение двойной буферизации в вашей форме также может помочь, но я не уверен в этом - хотя стоит эксперимента.

@ Хасан выше дал вам часть ответа - как подключиться к насосу сообщений Windowsкоторый и получает уведомления о событиях питания Windows - но сам по себе не приведет к перекрашиванию вашего окна (по крайней мере, из того, что я могурасскажите) - это скорее уведомление, которое гласит: «Эй, у тебя проблема, которую ты ненавидишь.Отстой, чтобы быть вами. "

Так что это, вероятно, так же просто, как подключиться к насосу сообщений Хасана и затем вызвать" this.Invalidate (); "всякий раз, когда получено уведомление о событии питания. Хотя это решение может бытьнемного излишним.

Если этого недостаточно, вам, возможно, придется сообщить самому элементу управления WPF Invalidate ... что он не может сделать, потому что у него нет этого метода. Документация предлагает это.InvalidateVisual () является эквивалентом, но мой опыт заставил меня поверить в обратное. За исключением признания недействительными на уровне winform, я не могу вам помочь. Если вы найдете ответ, пожалуйста, опубликуйте его!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...