WPF的UI虛擬化

2021-09-06 20:32:57 字數 1836 閱讀 5112

許多時候,我們的介面上會呈現大量的資料,如包含數千條記錄的**或包含數百張**的相簿。由於呈現ui是一件開銷比較大的動作,一次性呈現數百張**就目前的電腦效能來說是需要占用大量記憶體和時間的。因此需要對其進行優化。以前採用的方案大多數是翻頁,翻頁在某種程度上造成使用者瀏覽的中斷,因此現在往往採用一種新的方案——ui虛擬化。

關於ui虛擬化的實現,其核心則是virtualpanel,在wpf中內建的virtualpanel貌似只有virtualizingstackpanel乙個,不過這個也是最實用的,一般常用於**之類的資料呈現。如果需要其它布局方式的panel,則需要自己實現,msdn blog上有一系列文章介紹得比較詳細:

implementing a virtualizingpanel part i

implementing a virtualizingpanel part ii

implementing a virtualizingpanel part iii

implementing a virtualizingpanel part iv

實現自定義virtualizingpanel並非很複雜,首先介紹介紹幾個前置條件:

1. virtualizingpanel是用於ui虛擬化的,它是用來做itemscontrol的itemtemplate的,而不是像普通panel那樣直接控制children。

因此,它必須同itemscontrol及其子類(如datagrid、listbox)搭配使用,並繼承自virtualizingpanel。

2. virtualizingpanel是需要和scrollviewer一起使用的,沒有scrolviewer的話,所有控制項都是可見的,談不上虛擬化。

需要注意的是,itemscontrol的預設template沒有scrollviewer,在itemscontrol中使用virtualizingpanel時,需要修改一下template,加上scrollviewer,並設定cancontentscroll="true"。

3. ui虛擬化是需要在不呈現所有的ui控制項前提下知道當前檢視下元素呈現效果的,如果所有的資料都轉換了為控制項的話,也就談不上虛擬化了。也就是說,不能靠measure和arrange所有子元素來確定布局。

具體實現的時候一般有如下幾個功能點:

panel需要實現iscrollinfo介面,這樣才能手動控制滾動時候的介面虛擬化。關於iscrollinfo介面,我前面的文章中有一些介紹,可以參考一下。

panel需要能只根據資料感知整體的布局。常見的有三種方案:1. 在panel中直接指定每個子元素所佔據的空間大小,2. 拿第乙個子元素所佔據的大小來衡量其它子元素所佔據的大小,3.資料中直接宣告它所需要的大小

panel根據當前視窗的大小呈現元素(載入可見元素,刪除不可見元素)。

例子就可以直接參考前面的那個,這裡就不單獨舉例了。

資料虛擬化:

ui虛擬化可以解決渲染ui控制項所需要較多的時間和記憶體的問題,但是還是有可以優化的空間,那就是所有的資料仍然都載入到了記憶體中了。我們仍然可以採用和ui虛擬化一樣的優化方案:不載入所有資料到集合,只載入使用者可見部分。資料虛擬化本身並不受wpf所支援,不過當我們的panel實現iscrollinfo介面了之後,就可以精確感知滾動條了,實現資料虛擬化也不是難事。

一般來說,我們很少使用資料虛擬化,主要的原因是它大多數的時候只能減少很少一點記憶體占用,反而帶來了較大的**複雜度, 一般是認為得不償失的。

不過,有的時候,我們的資料是來自於外部rpc訪問,這個時候資料虛擬化就有意義了,考慮如下兩個場景:

新聞客戶端,資料**是來自於遠端的rest服務,但是它的介面是分頁獲取的,只能每次獲取50條,總共卻可能有100頁。

瀏覽器,不是來自於本地,而是來自於服務**。

WPF的UI虛擬化

原文 wpf的ui虛擬化 許多時候,我們的介面上會呈現大量的資料,如包含數千條記錄的 或包含數百張 的相簿。由於呈現ui是一件開銷比較大的動作,一次性呈現數百張 就目前的電腦效能來說是需要占用大量記憶體和時間的。因此需要對其進行優化。以前採用的方案大多數是翻頁,翻頁在某種程度上造成使用者瀏覽的中斷,...

WPF之UI虛擬化

原文 wpf之ui虛擬化 在wpf應用程式開發過程中,大資料量的資料展現通常都要考慮效能問題。有下面一種常見的情況 原始資料源資料量很大,但是某一時刻資料容器中的可見元素個數是有限的,剩餘大多數元素都處於不可見狀態,如果一次性將所有的資料元素都渲染出來則會非常的消耗效能。因而可以考慮只渲染當前可視區...

WPF之UI虛擬化

在wpf應用程式開發過程中,大資料量的資料展現通常都要考慮效能問題。有下面一種常見的情況 原始資料源資料量很大,但是某一時刻資料容器中的可見元素個數是有限的,剩餘大多數元素都處於不可見狀態,如果一次性將所有的資料元素都渲染出來則會非常的消耗效能。因而可以考慮只渲染當前可視區域內的元素,當可視區域內的...