2011-09-05 92 views
1

這是一個推測性問題,所以沒有提供代碼。界面刷新凍結應用程序,而油漆

我有一個應用程序需要一個大的XML文件,並從中建立一個視圖供用戶編輯。 XML的加載是在後臺工作人員進行的,然後通過樹形視圖以一種相當香草的MVVM方式綁定到視圖。

這一切都很好,並且在工作人員加載XML時顯示一個不錯的等待遊標。

然而,當XML文件變得非常大(20M)時,在新視圖的繪製期間UI將掛起。這是可以預料的,但它確實意味着應用程序仍然存在的所有視覺線索都會凍結。一旦裝載在塗裝前的工人完成之後,光標就被改變。是否有一個用於控件或漂亮技巧的'paintingHasFinished'類型事件可用作句柄,以便在此UI操作之後可以更改我的等待遊標?

回答

1

您可以通過使用分派器瞭解視圖何時完成呈現。

嘗試添加此:

this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => 
    { 
     Cursor = Cursors.Arrow; 
    } 
)); 

這掛接到調度員,要求它調用回調時,它的完成加載,使用的異步調用。提供的匿名操作將被調用,並應將光標恢復到正常狀態。

+0

這是一個有趣的想法。雖然這會在應用程序主調度程序當前操作結束時觸發調用嗎?那麼計時器線程FI可以在這裏嗎?我擔心異步電話,我需要在這裏嗎? – tigerswithguitars

+1

@tigerswithguitars:不需要害怕我不認爲。它將在Layout和Render通過後運行該操作,請參閱[dipatcher優先級列表](http://msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatcherpriority.aspx)。它也會在GUI線程上運行,所以我想有一個計時器線程可能會阻礙,但除非你修改任何不重要的字段屬性。 – markmuetz

+0

好的。那是個很好的觀點。它似乎爲我工作!我認爲這兩個重要答案的組合可能會解決很多其他問題,並且通常會提升我的WPF UI技能。我希望我可以選擇兩個!好東西。 – tigerswithguitars

1

您可以使用調度程序逐個添加您創建的ViewModel,或者使用調度程序逐個批量創建ViewModel,以便逐項添加項目,並且不會在加載操作結束時重載測量/佈局線程。這會增加整體加載時間,但也會增加用戶體驗。

還要確保打開虛擬化(虛擬化數據網格上的堆棧面板或列/行虛擬化),這將顯着提高大型數據集的性能。

+1

不幸的是,只有一個ViewModel:O ...所以我不能做增量。然而,我可以對UI數據可視化進行很好的搜索。聽起來像是一個有趣的調查區域。不是開玩笑。謝謝。 – tigerswithguitars