WPF重绘问题

时间:2011-05-11 10:36:12

标签: wpf wpf-controls winforms-interop

我遇到了重绘WPF控件的问题。

WPF控件被添加为Windows窗体的ElementHost.Child。

当Windows 7进入节能模式并恢复正常时(通过在键盘上移动鼠标或按键),其余的Windows表单控件将重新绘制,但WPF部分未重新绘制(以及Win 7背景)在该地区可见。)

在最小化和最大化应用程序时,WPF部分重新绘制。

有人对这个问题有任何想法吗?

2 个答案:

答案 0 :(得分:1)

这个问题的解决方案在MSDN杂志上提供了一段时间。它显示了如何使您的WPF应用程序“功耗感知”,即响应电源通知。这是一篇了不起的文章和“必读”。

点击此链接:Make Your WPF Apps Power-Aware

您可以在线浏览源代码或从此处下载:Code for PowerAware

使用的技术:

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

答案 1 :(得分:0)

通常,在窗体中调用Control上的.Invalidate()会导致它自己重绘(通过将整个控件的验证rect设置为“dirty”,然后让它以异步方式调用自己的paint事件。 - 如果你只是在没有的情况下调用winforms 中的Paint方法首先进行无效处理,您将只能重绘以前标记为脏的部分 - 因为Windows使用Dirty Rectangles approach来节省重绘时间。)

希望您可以在WPF主机控件上调用.Invalidate(),或者只在表单上调用.Invalidate()(例如“this.Invalidate();”)

在表单上启用双缓冲也可能会有所帮助,但我不确定这一点 - 但值得进行实验。

@Hasan上面给出了部分答案 - 如何挂钩到Windows消息泵并接收Windows电源事件通知 - 但本身不会导致您的窗口被重新绘制(至少从我能告诉的内容) ) - 这更像是一个通知,上面写着“嘿,你将会遇到你讨厌的那个问题。很难成为你。”

所以这可能就像连接Hasan的消息泵内容然后调用“this.Invalidate();”一样简单。任何时候收到电力事件通知。虽然这个解决方案可能有点矫枉过正。

如果这还不够,你可能不得不告诉WPF控件本身无效......它不能做,因为它没有那个方法。文档表明.InvalidateVisual()是等价的,但我的经验让我相信不然。除了在winform的级别上失效,我无法帮助你。如果您找到答案,请发布!