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

ListBox的滾動方式 分為像素滾動和列表項滾動

通過ListBox的附加屬性ScrollViewer.CanContentScroll來設置。因此ListBox的默認模板中,含有ScrollViewer,ScrollViewer下存放列表內容

    <ScrollViewer FocusVisualStyle="{x:Null}"><ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"/></ScrollViewer>

?而CanContentScroll,true支持邏輯單元(Item),false支持物理單元(像素)。源碼如下:

    /// <summary>///   獲取或設置一個值,該值指示是否支持元素 <see cref="T:System.Windows.Controls.Primitives.IScrollInfo" /> 接口允許滾動。/// </summary>/// <returns>///   <see langword="true" /> 如果 <see cref="T:System.Windows.Controls.ScrollViewer" /> 執行滾動操作使得在邏輯單元; 方面 <see langword="false" /> 如果 <see cref="T:System.Windows.Controls.ScrollViewer" /> 執行滾動操作使得在物理單元方面。///    默認值為 <see langword="false" />/// </returns>public bool CanContentScroll{get{return (bool) this.GetValue(ScrollViewer.CanContentScrollProperty);}set{this.SetValue(ScrollViewer.CanContentScrollProperty, value);}}

滾動

1、像素滾動(物理單元) ScrollViewer.CanContentScroll=false

通過查看源碼,我們可以得知CanContentScroll的默認值為false。所以列表ListBox/ListView/DataGrid默認像素滾動

    /// <summary>///   標識 <see cref="P:System.Windows.Controls.ScrollViewer.CanContentScroll" /> 依賴屬性。/// </summary>/// <returns>///   <see cref="P:System.Windows.Controls.ScrollViewer.CanContentScroll" /> 依賴項屬性的標識符。/// </returns>
    [CommonDependencyProperty]public static readonly DependencyProperty CanContentScrollProperty = DependencyProperty.RegisterAttached(nameof (CanContentScroll), typeof (bool), typeof (ScrollViewer), (PropertyMetadata) new FrameworkPropertyMetadata(BooleanBoxes.FalseBox));
  [FriendAccessAllowed]internal static class BooleanBoxes{internal static object TrueBox = (object) true;internal static object FalseBox = (object) false;internal static object Box(bool value){if (value)return BooleanBoxes.TrueBox;return BooleanBoxes.FalseBox;}}

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

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

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 列表開啟虛擬化的方式

轉載于:https://www.cnblogs.com/kybs0/p/7649463.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453027.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python爬蟲文獻綜述_基于Python下的爬蟲綜述及應用

98 Internet Application 互聯網 應用 引言&#xff1a;如今&#xff0c;大數據已經進入我們的各個領域&#xff0c;我們的工作及應用越來越需要獲取大量的數據。我們可以想象在一張蜘蛛網上沿著我們所需的方向爬取獵物(數據)的感覺。實際上爬蟲就是通過人為的模擬瀏覽器行為&…

HelloWorld新手常見問題

1.顯示錯誤&#xff1a; HelloWorld.java:1: 錯誤: 寫入HelloWorld時出錯: C:\HelloWorld.class public class HelloWorld { ^ 1 個錯誤 解決方法&#xff1a; 將文件轉移至D盤&#xff0c;然后編譯即可。不要放在C盤&#xff01; 2.顯示錯誤&#xff1a; 錯誤: 找不…

淺談HTTPS以及Fiddler抓取HTTPS協議

原文 淺談HTTPS以及Fiddler抓取HTTPS協議 最近想嘗試基于Fiddler的錄制功能做一些接口的獲取和處理工作&#xff0c;碰到的一個問題就是簡單連接Fiddler只能抓取HTTP協議&#xff0c;關鍵的登錄請求等HTTPS協議都沒有捕捉到&#xff0c;所以想讓Fiddler能夠同時抓取到HTTPS和HT…

關于.c和.h 和定義變量的問題

最初調試的時候是因為有個錯誤在wavplay.h文件中 于是我跳到了recorderl.h中:從圖中看到引用了main.h 出現這個問題的具體原因還是不太清楚: 不過我任務是因為: wavplay.h中定義了 __WaveHeader 變量 在main.h文件中引用了wavplay.h 而在wavplay.h中試圖引用main.h里的 __Wa…

halcon中面到面的距離_halcon學習筆記——(8)由標定板得到測量平面位姿-阿里云開發者社區...

如圖&#xff1a;由標定板位姿獲取測量板位姿1.pose_to_hom_mat3d( : : Pose : HomMat3D)把三維位姿轉化為齊次變換矩陣2.hom_mat3d_translate_local( : : HomMat3D, Tx, Ty, Tz : HomMat3DTranslate)相對于新坐標系的平移變換/ 1 0 0 \ / Tx \HomMat3DTranslate HomMat3D *…

進程同步與互斥的區別

并發進程的執行會產生相互制約的關系&#xff1a;一種是進程之間競爭使用臨界資源&#xff0c;只能讓他們逐個使用&#xff0c;這種現象稱為互斥&#xff0c;是一種競爭關系。另一種是進程之間協同完成任務&#xff0c;在關鍵點上等待另一進程發來的消息&#xff0c;以便協同一…

《軟件調試分析技術》學習筆記

《軟件調試分析技術》學習筆記&#xff08;一&#xff09; 今天開始寫寫一些心得體驗。 《軟件調試分析技術》是好友Monster的處女作品。作為一直以的好伙伴&#xff0c;他是我看著長大的&#xff0c;(*^__^*) 嘻嘻……之所以有今天這樣的成績&#xff0c;是與他的努力和天賦…

new Date()時間

var myDate new Date(); myDate.toLocaleDateString()&#xff1b;可以獲取當前日期myDate.toLocaleTimeString(); 可以獲取當前時間擴展&#xff1a;myDate.getYear(); //獲取當前年份(2位)myDate.getFullYear(); //獲取完整的年份(4位,1970-????)myDate.getMonth(); //獲…

什么是對等網絡

對等網也稱工作組。在對等網絡中&#xff0c;計算機的數量通常不會超過10臺。所以對等網絡相對比較簡單。在對等網絡中&#xff0c;對等網上各臺計算機的有相同的功能&#xff0c;無主從之分&#xff0c;網上任一節臺計算機既可以作為網絡服務器&#xff0c;其資源為其它計算機…

python初中必背語法_一些python語法的合集

貼幾道自己做過的py題防止忘了&#xff0c;好像包含的語法還挺多的洛谷1018nn,mminput().split( )oint(input())nint(nn);mint(mm)a[[]];c[[]]for i in range (1,43):a.append([]);c.append([])for i in range (1,43):for j in range (1,43):a[i].append(0),c[i].append(0)b[]f…

微信 {errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}

{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"} 聲明&#xff1a;是已認證的服務號 這個問題已解決&#xff01;&#xff01; 前置說明 網頁授權獲取用戶基本信息&#xff1a;兩種 scope 域 https://open.w…

解決ubuntu首次安裝Mysql之后,首次登錄出現ERROR 1698 (28000): Access denied for user 'root'@'localhost'的方法

解決步驟&#xff1a; 1.打開終端&#xff0c;輸入sudo vi /etc/mysql/debian.cnf 打開/etc/mysql/debian.cnf文件&#xff0c;顯示如下&#xff1a; 2.mysql -udebian-sys-maint -p 打開mysql 輸入密碼為上圖中password字段 3.修改root密碼 ALTER USER rootlocalhost IDEN…

六十萬的成長_我的EA策略分析和實現

曾經看過一個故事&#xff1a;在流水線上需要檢測面包盒子是不是空的&#xff0c;科技人員使用各種紅外線等等高科技&#xff0c;達到了目的&#xff1b;有一個工人用一臺風扇就解決了這個問題......其實解決問題可以很簡單&#xff0c;只要能實現目標&#xff0c;過程越簡單越…

流量控制和擁塞控制

流量控制是用于控制調制解調器與計算機之間的數據流&#xff0c;具有防止因為計算機和調制解調器之間通信處理速度的不匹配而引起的數據丟失。通常有硬件流量控制&#xff08;RTS/CTS&#xff09;和軟件流量&#xff08;XON/XOFF&#xff09;控制。 擁塞現象是指到達通…

內聚的極限: 軟件開發的不確定性原理

高內聚是有極限的. 當代碼在一個維度上高度內聚的時候, 在其它維度上是發散的. -- 代碼內聚設計的不確定性原理 大家都知道量子力學的不確定性原理: 在微觀世界里, 有幾對物理量不能同時精確的測定, 包括速度與位置, 以及能量與時間. 比如當我們精確的測定一個粒子的速度使其誤…

python獲取window共享目錄列表_利用Python獲取DICOM RTstructure勾畫列表

在《利用Python打開DICOM CT文件》一文中&#xff0c;我們利用pydicom.dcmread()讀取了CT圖像。本文中我們將修改load_scan()函數來讀取RTstructure文件并獲取勾畫列表1. 打開Jupyter notebook&#xff0c;導入需要的科學包import numpy as npimport mathimport pydicomimport …

sublime 自定義快捷鍵

[{ "keys": ["altspace"], "command": "auto_complete" }, // 自動提示、補全{ "keys": ["ctrlalti"], "command": "reindent" }, //整理代碼快捷鍵{ "keys": ["f12"…

Ubuntu中安裝、生成、導入、導出、Python3虛擬環境

1.安裝Ubuntu虛擬環境、以及可以支持虛擬環境的模塊 sudo apt install virtualenv sudo apt install virtualenvwrapper 安裝完成之后&#xff0c;進入home目錄&#xff0c;輸入命令ls -al查看是否出現.virtualenvs目錄&#xff0c;如果沒有則手動創建.virtualenvs目錄 重要…

Coursera課程 Programming Languages, Part C 總結

碎言碎語 和前面的 ML 和 Racket 感覺明顯不一樣了&#xff0c;一邊學著一邊覺得這真是一門奇怪的語言&#xff0c;有著各種奇怪的語法&#xff0c;不過真的算是一個奇妙的體驗&#xff08;相比前面的兩門語言&#xff0c;Ruby 的學習資源多了不少&#xff09;。week 1 的作業直…