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.mzph.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 的作业直…