2011-05-11 205 views
7

好的,在Windows窗體中,您可以使用.refresh()在元素上產生重繪事件。 WPF中有類似的解決方案嗎?WPF強制重繪畫布

我正在做什麼的解釋,我正在繪製一個畫布對象的迷宮,並且希望看到迷宮畫出來(所以我可以看到進展),而不是等待28分鐘的解決方案突然出現。我在畫布上繪製了一系列Rectangle s。刷新應該放在矩形還是畫布上?

這裏是最近的輸出: http://imgur.com/ftFOv

我想在C#中的解決方案,如果這是可能的。謝謝。

回答

7

您可能想要使用Dispatcher對象。我建議你看看這個肖恩Wildermuth的文章:Build More Responsive Apps With The Dispatcher(MSDN雜誌2007年10月)。

+9

這不是100%的解決方案,但它使我朝着正確的方向前進。這最終是什麼工作:'canvas.Dispatcher.Invoke(emptyDelegate,DispatcherPriority.Render);'where emptyDelegate是'Action emptyDelegate = delegate {};' – ohmusama

+0

謝謝,西蒙,你今天早些時候編輯。我正在閱讀這篇文章。 – philologon

+2

「使用調度程序構建更多響應式應用程序」的鏈接不再有效。 –

26

這是你正在尋找...

element.InvalidateVisual(); 
+0

這很好,謝謝@亞當 – J3soon

11

這個工作對我來說是什麼?

element.UpdateLayout(); 
2

沒有好的Minimal, Complete, and Verifiable code example清楚自己在做什麼表現,這是不可能的確切知道這裏最好的答案是什麼。但是,從您的描述中,聽起來好像迷宮生成算法正在UI線程中執行,阻止UI自行更新。

正如在的WinForms,那裏的人們很有誘惑力的調用方法,如Refresh()Application.DoEvents(),這裏真正的問題的情況是,您阻止UI線程正確修復方法就是,不要那樣做

有很多的選擇,沒有一個更詳細的問題,沒有辦法知道什麼是你的情況下最好的辦法。然而,兩種最常用和最可能合適的技術是使用BackgroundWorkerTask.Run()Progress<T>類別的組合。無論哪種情況,您的算法都運行在不同的線程中,並定期將更新傳遞給UI線程(例如,每個矩形,每十個矩形,等等)。 UI線程接收更新,將數據添加到視覺效果,然後返回等待下一次更新。

BackgroundWorkerProgress<T>都提供了自動將數據封送回UI線程的內置機制。唯一需要注意的是,無論您使用哪些類,都需要在UI線程上創建該類的實例。由於在開始執行異步工作之前需要設置它們,所以這通常不是問題;它是免費的。

如果你這樣做,你將不需要任何黑客,比如迄今爲止在這裏提出的三種不同的黑客(其中兩項似乎不適用於「我已經阻止我的UI線程,現在什麼?「場景)。