我在重绘我的 WPF 控件时遇到问题。
WPF 控件添加为 Windows 窗体的 ElementHost.Child。
当 Windows 7 进入省电模式并恢复正常时(通过移动鼠标或键盘上的按键),其余的 Windows 窗体控件被重新绘制,但是 WPF 部分没有被重新绘制(并且 Win 7 背景在那个区域)。
在应用程序的最小化和最大化时,WPF 部分被重新绘制。
有人对这个问题有任何想法吗?
我在重绘我的 WPF 控件时遇到问题。
WPF 控件添加为 Windows 窗体的 ElementHost.Child。
当 Windows 7 进入省电模式并恢复正常时(通过移动鼠标或键盘上的按键),其余的 Windows 窗体控件被重新绘制,但是 WPF 部分没有被重新绘制(并且 Win 7 背景在那个区域)。
在应用程序的最小化和最大化时,WPF 部分被重新绘制。
有人对这个问题有任何想法吗?
不久前,MSDN 杂志中提供了此问题的解决方案。它展示了如何使您的 WPF 应用程序“具有电源意识”,即响应电源通知。这是一篇了不起的文章,也是“必读”。
检查此链接:让您的 WPF 应用程序具有电源意识
您可以在线浏览源代码或从此处下载:PowerAware 代码
使用的技术:
通常,在 Windows 窗体中,在 Control 上调用 .Invalidate() 会导致它重新绘制自身(通过将整个控件的验证矩形设置为“脏”,然后让它异步调用自己的绘制事件。——如果你只是调用 Paint winforms 中的方法没有先失效,您将只能重绘以前标记为脏的部分——因为 windows 使用脏矩形方法来节省重绘时间。)
希望您可以在 WPF 主机控件上调用 .Invalidate() 或仅在表单本身上调用 .Invalidate()(例如“this.Invalidate();”)
在您的表单上启用双缓冲也可能会有所帮助,但我不确定这一点 - 虽然值得尝试。
上面的@Hasan给了你部分答案——如何连接到windows消息泵并接收windows电源事件通知——但它本身不会导致你的窗口被重新粉刷(至少据我所知)——它更像是一个通知,上面写着“嘿,你即将遇到你讨厌的问题。糟糕的是你。”
所以这可能就像挂钩到 Hasan 的消息泵一样简单,然后调用“this.Invalidate();” 任何时候收到电源事件通知。尽管该解决方案可能有点矫枉过正。
如果这还不够,您可能必须告诉 WPF 控件本身使无效...它不能这样做,因为它没有该方法。文档表明 .InvalidateVisual() 是等价的,但我的经验让我不相信。除了在winform级别无效之外,我无能为力。如果您找到答案,请发布!