2011-01-13 93 views
0

我正在寫一個Silverlight應用程序,我試圖改善加載時間。有一個ObservableCollection更新用戶界面元素得到添加

當我的頁面加載,我先初始化我的ObservableCollection:

 this.MyItems = new ObservableCollection<Item>(); 

我的UI是我通過代碼綁定到一個ObservableCollection一個列表框。在MainPage_Loaded中:

 MyList.ItemsSource = App.ViewModel.MyItems; 

現在我將UI綁定到我的模型。我期望這是有效的,因爲集合是空的,並且其餘的UI可以繼續加載(不確定我的假設是否正確)。

 DataContext = App.ViewModel; 

現在我想將項目添加到我的收藏:

 for (int i = 0; i < number_of_items; i++) 
     { 
      this.MyItems.Add(myItems[i]); // myItems is a List<Item> already populated 
      Thread.Sleep(20); 
     } 

我的目標是讓線程睡眠,以便它有時間來呈現每個列表框項目的用戶界面。另外,我預計我的用戶界面一次只能顯示一個項目。

結果是ListBox元素一次出現。如果我設置1秒鐘的睡眠時間,則1秒鐘後元素數量將填充ListBox。

優化此操作的好方法是什麼?如果它是徒勞的,我也可以將我的ListBox綁定到完全填充的ObservableCollection。謝謝!

+0

你使用VirtualizingStackPanel嗎? – onmyway133 2012-12-09 08:47:35

回答

4

嘗試將循環移至後臺線程。這是一種方法。

Phạm Tiểu Giao - Threads in WP7

注意你需要派遣UI更新。如果你想使用一個固定的時間段像

Dispatcher.BeginInvoke(() => { this.MyItems.Add(myItems[i]); }); 

睡眠的東西會工作。只要確保時間長度爲總是比更新顯示所花費的時間更長,否則您可能會用更快的速度重載UI線程,使其更新速度超過其可以處理的時間。

+0

謝謝,這正是我想要的:) – siger 2011-01-13 07:59:20

+0

yw :) ../15char – 2011-01-13 08:03:58

2

我們綁定到ObservableCollection的原因是內置通知通過INotifyPropertyChanged接口實現發生屬性更新。這會導致在對基礎集合的每次更新中觸發事件,這會導致重新繪製相關的UI元素(在這種情況下爲ListBox)。數據模板在每次重繪時應用於集合中的每個項目,並通過數據綁定自動完成。這些項目將以比平局更快的速度(在一個單獨的線程中)添加到您的收藏中,因此,爲什麼看起來您的負載會延遲到所有項目被添加爲止。由於在添加新項目時屏幕上繪製和失效,因此您在屏幕上直觀地忽略重繪週期。

這意味着您的Thread.Sleep調用只會延遲添加的每個項目上的元素的完全重繪(*添加的項目數量解釋了爲什麼您的UI將完全重繪在每個項目上,但僅限於全部已經進行了相應的Thread.Sleep調用,它阻止了用於n * sleepValue時間的UI線程)。這就是爲什麼我們需要使用如上所述的Dispatcher對象,因爲這些調用是在不同的線程上進行的。這使我們可以從UI線程重新繪製,這本質上是同步阻塞調用。

我絕對不會在這裏使用Dispatcher,因爲它是多餘的,並且防止發生本地同步,因爲調度程序可能引用尚未創建並添加到可視樹或邏輯樹的元素(正如您的評論將設置爲1000ms與20ms之間的值)。您將仍然重新繪製集合中的所有項目,因爲每個項目都會添加,從而導致您的睡眠呼叫無效或無法使用,因爲缺乏更好的術語。

作爲一種替代解決方案,我提供的是,您可以在數據模板的根元素的「不透明度」屬性中添加故事板動畫,以便創建項目的視覺效果,從而「一次添加一個項目」。 「這樣,當每個項目被添加到底層集合中時,它們將用不透明度淡化動畫來繪製,從而給出幻覺,每個項目被單獨添加一個(並且動畫到視圖中)並且具有單獨的動畫(在不同的偏移處定義的動畫)。我相信這會給你你想要的效果。但由於繪圖調用來自ListBox,因爲它維護着它的項目集合,所以每個.Add調用ViewModel項目的ObservableCollection對象將會使整個集合失效。實際上沒有辦法來覆蓋這種行爲,因爲它發生在層次結構的上游一層。我會建議反對提供的方法。

相關問題