這篇博客將介紹WPF中的虛擬化技術。
1. Data Virtualization 通常情況下我們說數據虛擬化是指數據源沒有完全加載,僅加載當前需要顯示的數據呈現給用戶。這種場景會讓我們想到數據分頁顯示,當需要特定頁面的數據時,根據頁數請求相應數據。
WPF沒有提供對Data Virtualization原生態的支持,當時我們可以使用Paging相關技術來實現。在我先前的博客WPF 實現 DataGrid/ListView 分頁控件中有介紹。
2. UI Virtualization 是針對數據容器渲染數據項的一個優化。舉個例子,一個ListView/ListBox控件中有10000個Item,但是可見的只有10個,那么此時只渲染並顯示這10個Item,剩余的9990個Item不實例化和顯示。這樣可以提高程序的性能。
WPF中VirtualizingStackPanel容器是實現了UI Virtualization的容器,VirtualizingStackPanel也是ListBox/ListView的默認數據容器。
下面通過一個例子來展示開啟UI 虛擬化和關閉UI 虛擬化對程序性能產生的影響。
<ListView x:Name="VirtualizationListView" VirtualizingPanel.VirtualizationMode="Recycling" VirtualizingPanel.IsVirtualizing="True"/>
public MainWindow() { InitializeComponent(); this.Loaded += delegate { List<string> items = new List<string>(); for (int i = 0; i < 10000; i++) { items.Add(string.Concat("item", i)); } this.VirtualizationListView.ItemsSource = items; }; }
此時當通過Scrollbar滾動時,內存的波動不明顯。
VirtualizingPanel.VirtualizationMode="Recycling"表示不循環實例化新的Item,例如Item1--Item20此時可見,拖動滾動條到Item100,再從Item100返回至Item1--Item20時,這時候Item1--Item20不會被重新實例化。默認情況下 VirtualizingPanel.VirtualizationMode="Standard"。在ListView進行滾動時,內存會用增加。
當關閉UI虛擬化之后,內存的變化非常顯著,因為程序初始化時就將這10000條數據全部在ListView中實例化出來了。
當遇到上述場景時,可以合理的使用虛擬化技術來提高程序的性能。
感謝您的閱讀。