2013-03-06 79 views
4

我聽說這會刷新UI,但爲什麼會這樣? Dispatcher調用這個空行爲,並且它不存在調用InvalidateMeasure(),這將觸發UI重新測量並重新安排並在動作內重新渲染。這裏的措施和安排過程到update/refresh UI?刷新WPF中UI的困惑

private static Action EmptyDelegate = delegate() { }; 

public static void Refresh(UIElement uiElement) 
{ 
    uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate); 
} 

任何幫助?

EDITED:我想知道爲什麼UI渲染的細節。像well that triggers ui update這樣的答案不幫助我的任何進一步的傢伙。

+0

這可能會有所幫助,如果你發佈這個想法的來源參考。 – Clemens 2013-03-06 13:40:52

+0

我編輯了一下我的問題。沒有提到你的意思。這似乎是在wpf中刷新控件的常用方法。如果你熟悉WPF,你不需要任何引用來理解代碼。我想知道爲什麼這個代碼會刷新UI,因爲沒有任何操作或沒有任何操作可以讓UI進行重新計算和重新渲染。它的空的行動,但似乎刷新用戶界面。爲什麼? – 2013-03-06 15:26:08

+0

當您編寫「我聽說過這會刷新UI」或「這似乎是在wpf中刷新控件的常用方法」時,您聽起來像是從某處獲得了此想法。從哪裏知道究竟是有趣的... – Clemens 2013-03-06 15:47:24

回答

2

微軟建議您使用PushFrame做一些細微的不同的代碼操作。

該代碼與渲染無關。它的作用類似於VB6和WinForms中已知的DoEvents方法。 DoEvents在泵送Windows消息隊列並處理隊列中的消息時暫停程序。這包括任何呈現消息,例如WM_PAINTWM_NCPAINT

該代碼指示分派器暫停當前線程並抽取其隊列並處理所有具有DispatcherPriority.Render或更高優先級的消息。如果隊列中有任何掛起的呈現消息,例如,如果InvalidateRect已被框架調用,那麼這些消息將被處理並且UI將被重新呈現。

DoEvents一直被認爲是代碼異味,因爲它繞過了消息隊列。如果你想要一個響應式用戶界面,你應該使用工作線程代替。

+0

推送幀鏈接不再有效 – 2015-08-03 10:58:17

1

由於調用的優先級,這可以用於強制WPF更新UI。由於此調用同步使用Dispatcher,因此在運行您提供的委託之前將運行已經排隊等於或高於DispatcherPriority.Render的任何任務。

下面是潛在值DispatcherPriority的列表,它解釋了訂單任務由調度員執行。

+0

我仍然不明白爲什麼會更新用戶界面?罰款它等待,直到優先級「發送」,「正常」完成,然後空操作將被執行,這就是它。有沒有重新測量。重新測量,重新排列和重新渲染以更新UI的位置在哪裏? – 2013-03-06 15:31:43

+0

我相信'Render'優先級包含執行測量,排列和渲染的任務 - 我正在尋找定義現在在這裏發生的事情的東西。 – davisoa 2013-03-06 15:37:34

+0

渲染只是優先級,它不包含任何額外的任務。 – 2013-03-06 15:45:03