WPF 列表虛擬化時的滾動方式

2021-09-19 22:08:57 字數 2641 閱讀 3231

原文:

wpf 列表虛擬化時的滾動方式

listbox的滾動方式 分為畫素滾動和列表項滾動

通過listbox的附加屬性scrollviewer.cancontentscroll來設定。因此listbox的預設模板中,含有scrollviewer,scrollviewer下存放列表內容

<

scrollviewer

focusvisualstyle=""

>

<

itemspresenter

snapstodevicepixels=""

/>

scrollviewer

>

而cancontentscroll,true支援邏輯單元(item),false支援物理單元(畫素)。原始碼如下:

///

///獲取或設定乙個值,該值指示是否支援元素

介面允許滾動。

/// ///

///如果

執行滾動操作使得在邏輯單元; 方面

如果 執行滾動操作使得在物理單元方面。

///預設值為

/// public

bool

cancontentscroll

set }

1、畫素滾動(物理單元) scrollviewer.cancontentscroll=false

通過檢視原始碼,我們可以得知cancontentscroll的預設值為false。所以列表listbox/listview/datagrid預設畫素滾動

///

///標識

依賴屬性。

/// ///

///依賴項屬性的識別符號。

///[commondependencyproperty]

public

static

readonly dependencyproperty cancontentscrollproperty = dependencyproperty.registerattached(nameof (cancontentscroll), typeof (bool), typeof (scrollviewer), (propertymetadata) new frameworkpropertymetadata(booleanboxes.falsebox));

[friendaccessallowed]

internal

static

class

booleanboxes

}

畫素滾動的優點:平滑--因為按照畫素滾動,肉眼分辨較低。

畫素滾動的缺點:耗效能-列表中每個項,都要計算出寬高具體數值,且滾動時時計算。如果列表中數量過多,就相當卡了。

2、列表項滾動(邏輯單元) scrollviewer.cancontentscroll="true"

按照item高寬為滾動單位。

列表項滾動時,列表只會滾動到乙個完整的item,不會有乙個item只顯示一半的情況。

通過virtualizingpanel,設定列表listbox/listview/datagrid是否開啟虛擬化

virtualizingpanel其它屬性有:

virtualizingpanel.scrollunit="pixel"--虛擬化滾動單位(畫素/單元)

virtualizingpanel.isvirtualizing="true" --是否虛擬

virtualizingpanel.virtualizationmode="recycling"

virtualizingpanel.cachelengthunit="item" --快取單位

virtualizingpanel.cachelength="20,20"-上下快取數量

開啟虛擬化:為何需要設定scrollviewer.cancontentscroll="true"?

開啟虛擬化後,virtualizingpanel.scrollunit會替換原有的scrollviewer.cancontentscroll滾動方式

虛擬化也有物理單元與邏輯單元之分,滾動單元設定會轉移到virtualizingpanel.scrollunit

但是scrollviewer.cancontentscroll="false"畫素滾動,並不僅僅是滾動消耗效能。當資料很多時載入列表,即使開啟了虛化化,因計算太耗效能,介面一樣卡頓。

有乙個解決辦法,設定scrollviewer.cancontentscroll="true"後,在虛擬化設定中,可以設定虛擬化滾動單元virtualizingpanel.scrollunit="pixel",此即為虛擬化時的畫素滾動。

另:虛擬化時的列表項滾動,virtualizingpanel.scrollunit="item"列表項

注:virtualizingpanel.scrollunit和scrollviewer.cancontentscroll的設定滾動單元一樣。

設定虛擬單位為邏輯單元時,滾動時會自動滾動到乙個完整的項,而不是滾動到項的部分。

因此當列表可見區域,items數量或者高寬會變化時,列表滾動時會閃現。

列表正確開啟虛擬化方式,請看我的另一部落格:wpf 列表開啟虛擬化的方式

虛擬滾動列表

有乙個很長的列表需要展示,如果是全部直接全部展示,會因為一次性建立了太多的dom節點,從而導致卡死。除非分頁 解決辦法是 採用虛擬滾動。比如有1k條資料,但是我們可以看到的部分可能只有幾十條,所以,那些我們看不到的dom節點,完全沒有必要去渲染。所以,虛擬滾動就是只渲染可視部分的dom節點,在滾動的...

WPF的UI虛擬化

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

WPF的UI虛擬化

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