2009-09-07 152 views
32

我想簡單介紹一下在我的MVVM中如何實現ItemsControl的虛擬化堆棧面板,該面板是數據綁定到ObservableCollectionWPF VirtualizingStackPanel以提高性能

我有一個ItemsControl實例爲選項卡控件中的每個選項卡,切換選項卡變得非常慢,當ItemsControl越來越大。

我能做些什麼來加速應用程序?

我打開了一個WPF分析器,並看到每個選項卡的ItemsControl中顯示的每個元素(這是一個自定義用戶控件)都有自己的ContentPresenter。所以我基本上有100個內容演示者在MVVM中的ObservableCollection中運行100個項目。這是否正確?我如何優化?

回答

48

有兩種技術可能是一個很大的幫助。比阿斯托爾尼茨在她的blog上描述得非常好。

首先是UI Virtualization ,第二個是Data Virtualization

在UI虛擬化,您使用的東西,像VirtualizingStackPanel使UI繪製較少的事情。

數據虛擬化可以確保你沒有帶一百萬個對象到內存中,當你只打算顯示100

所以UI虛擬化減少繪製的事物的數量和數據虛擬化減少的事物的數量可能被畫下來。

希望幫助

9

我有確切的IND WPF使用的TabControl和DataGrid同樣的問題。通過增加DataGrid元素的大小,切換標籤變得非常慢!之後,我發現這篇文章讀取了Bea Stolnitz的博客,正如前面的回答所設想的那樣。這給我的暗示,以谷歌「WPF的tabcontrol VirtualizingStackPanel」 這給我的鏈接DrWPF:http://groups.google.com/group/wpf-disciples/browse_thread/thread/6f3531a1720252dd

他準確地描述這個問題並給出解決方案:-))

.... PERF的命中在樹的建築期間。不幸的是,如果您正在使用典型的MVVM方法,並且在TabControl的ItemsSource屬性中使用了綁定,則必須每次都重新構建整棵樹。
選擇了一個選項卡項目。這通常是一項非常昂貴的操作。 ...