簡體   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