我遇到了重绘WPF控件的问题。
WPF控件被添加为Windows窗体的ElementHost.Child。
当Windows 7进入节能模式并恢复正常时(通过在键盘上移动鼠标或按键),其余的Windows表单控件将重新绘制,但WPF部分未重新绘制(以及Win 7背景)在该地区可见。)
在最小化和最大化应用程序时,WPF部分重新绘制。
有人对这个问题有任何想法吗?
答案 0 :(得分:1)
这个问题的解决方案在MSDN杂志上提供了一段时间。它显示了如何使您的WPF应用程序“功耗感知”,即响应电源通知。这是一篇了不起的文章和“必读”。
点击此链接:Make Your WPF Apps Power-Aware
您可以在线浏览源代码或从此处下载:Code for PowerAware
使用的技术:
答案 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的级别上失效,我无法帮助你。如果您找到答案,请发布!