好的,在Windows窗體中,您可以使用.refresh()
在元素上產生重繪事件。 WPF中有類似的解決方案嗎?WPF強制重繪畫布
我正在做什麼的解釋,我正在繪製一個畫布對象的迷宮,並且希望看到迷宮畫出來(所以我可以看到進展),而不是等待28分鐘的解決方案突然出現。我在畫布上繪製了一系列Rectangle
s。刷新應該放在矩形還是畫布上?
這裏是最近的輸出: http://imgur.com/ftFOv
我想在C#中的解決方案,如果這是可能的。謝謝。
好的,在Windows窗體中,您可以使用.refresh()
在元素上產生重繪事件。 WPF中有類似的解決方案嗎?WPF強制重繪畫布
我正在做什麼的解釋,我正在繪製一個畫布對象的迷宮,並且希望看到迷宮畫出來(所以我可以看到進展),而不是等待28分鐘的解決方案突然出現。我在畫布上繪製了一系列Rectangle
s。刷新應該放在矩形還是畫布上?
這裏是最近的輸出: http://imgur.com/ftFOv
我想在C#中的解決方案,如果這是可能的。謝謝。
您可能想要使用Dispatcher對象。我建議你看看這個肖恩Wildermuth的文章:Build More Responsive Apps With The Dispatcher(MSDN雜誌2007年10月)。
這個工作對我來說是什麼?
element.UpdateLayout();
沒有好的Minimal, Complete, and Verifiable code example清楚自己在做什麼表現,這是不可能的確切知道這裏最好的答案是什麼。但是,從您的描述中,聽起來好像迷宮生成算法正在UI線程中執行,阻止UI自行更新。
正如在的WinForms,那裏的人們很有誘惑力的調用方法,如Refresh()
或Application.DoEvents()
,這裏真正的問題的情況是,您阻止UI線程。 正確修復方法就是,不要那樣做。
有很多的選擇,沒有一個更詳細的問題,沒有辦法知道什麼是你的情況下最好的辦法。然而,兩種最常用和最可能合適的技術是使用BackgroundWorker
或Task.Run()
與Progress<T>
類別的組合。無論哪種情況,您的算法都運行在不同的線程中,並定期將更新傳遞給UI線程(例如,每個矩形,每十個矩形,等等)。 UI線程接收更新,將數據添加到視覺效果,然後返回等待下一次更新。
BackgroundWorker
和Progress<T>
都提供了自動將數據封送回UI線程的內置機制。唯一需要注意的是,無論您使用哪些類,都需要在UI線程上創建該類的實例。由於在開始執行異步工作之前需要設置它們,所以這通常不是問題;它是免費的。
如果你這樣做,你將不需要任何黑客,比如迄今爲止在這裏提出的三種不同的黑客(其中兩項似乎不適用於「我已經阻止我的UI線程,現在什麼?「場景)。
這不是100%的解決方案,但它使我朝着正確的方向前進。這最終是什麼工作:'canvas.Dispatcher.Invoke(emptyDelegate,DispatcherPriority.Render);'where emptyDelegate是'Action emptyDelegate = delegate {};' – ohmusama
謝謝,西蒙,你今天早些時候編輯。我正在閱讀這篇文章。 – philologon
「使用調度程序構建更多響應式應用程序」的鏈接不再有效。 –