繁体   English   中英

如何强制使 WPF window 无效?

[英]How to force invalidate WPF window?

我正在开发一个 WPF 应用程序,该应用程序还使用一些使用DirectX的本机 C++ 专有库。 在一些罕见但确定性的情况下,本机库会弄乱 WPF Window 我需要一种重新渲染 WPF window 的方法,即使 WPF 的观点没有任何改变。 只是那个库(这是我无法控制的)有一个错误,弄乱了正常的 WPF 渲染。

我尝试过InvalidateVisualInvalidateArrangeInvalidateMeasureUpdateLayout等方法。 即使所有这些,但它不起作用。 使其部分工作的一种方法是在 window 中的各种控件之一中更改某些属性(例如将Foreground画笔颜色更改一位),但是重新渲染只是部分的。

一种确定的方法是稍微调整 window 的大小,但是当应用程序处于我们支持的全屏模式时,除了标准的最大化模式外,这不起作用。

有没有办法告诉 WPF 即使什么都没改变,还是请重画?

更新:提供了专有库中的修复程序,为我解决了问题。 但是仍然很奇怪,没有强制重绘的好方法。 最好的解决方法是遍历所有视觉子对象并稍微修改 FG 和 BG 画笔,强制重绘。

我认为InvalidateVisual是 go 的方式,但您可能不知道 WPF 中的渲染是在另一个线程上执行的,因此不会同步执行重绘。 要强制进行同步操作,可以使用Dispatcher等待重绘:

// In your Window code-behind
this.InvalidateVisual();
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => { })).Wait();
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => { })).Wait();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM