Подтвердить что ты не робот

Проблема с перерисованием WPF

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

  • WPF
  • .Net Framework 3.0
  • Windows Vista/Windows XP

Ответ 2

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

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

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

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

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

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