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

WPF 列表虚拟化时的滚动方式相关推荐

  1. Android图片控件,跟随列表(recyclerView)的上下滚动而同步平移。

    一个用于放置在RecycleView中的图片控件,其主要功能是跟随列表的上下滚动而上下平移,使得呈现出一种图像相对列表静止的感觉. Overview ScrollingImageView 提供以下特性 ...

  2. python可变参数的特点_可变参数**kwargs传入函数时的存储方式为( )_学小易找答案...

    [单选题]抗结核药联合用药的目的是: [单选题]女性,50岁,患耐青霉素的金葡菌性心内膜炎,青霉素试敏阴性,既往有慢性肾盂肾炎,应选用: [填空题]固态下原子(或分子)呈( )排列而形成的聚集状态,称 ...

  3. SAP UI5 应用开发教程之六十七 - 基于 OData V4 的 SAP UI5 List-Detail(列表-明细)布局的实现方式试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  4. permutations python_为什么Python的itertools.permutations包含重复项? (当原始列表重复时)...

    为什么Python的itertools.permutations包含重复项? (当原始列表重复时) 普遍认为,n个不同符号的列表有n! 排列. 但是,当符号不明确时,在math和其他地方最常见的惯例似 ...

  5. [转贴]虚拟化时记忆体管理:AMD NPT/Intel EPT简介--转自沈洁转自某港澳台同胞

    ◎标题:[硬体技术]虚拟化时记忆体管理:AMD NPT/Intel EPT简介 ◎前言:在x86架构中,记忆体分页(page tables)是用来保护记忆体位址,使记忆体在多个程式存取时不互相干扰.然 ...

  6. 爱奇艺怎么开启从列表删除时同时删除本地文件

    1.先打开电脑,双击电脑桌面上的爱奇艺. 爱奇艺怎么开启从列表删除时同时删除本地文件 2.然后点击爱奇艺边上的下拉箭头. 爱奇艺怎么开启从列表删除时同时删除本地文件 3.之后点击设置. 爱奇艺怎么开启 ...

  7. 【教程】关于打开一些exe文件时,打开方式为microsoft store的解决办法

    [教程]关于打开一些exe文件时,打开方式为microsoft store的解决办法 前言 解决 ---------------- 版权声明:本文为CSDN博主「SogK1997」的原创文章,遵循CC ...

  8. 列表页进入详情页再返回列表页时,显示默认第一页的bug修复

    如图所示,当我点击分页第二页的第一项,进入详情页后,在点击返回按钮,按理说应该返回到列表页第二页,但是却变成了默认的首页 究其原因,大概是在返回列表页时,接口传参的当前页码pageNum默认传的是1, ...

  9. 处理ios软键盘弹起和收起时页面滚动问题

    处理ios软键盘弹起和收起时页面滚动问题 背景: 在开发添加主播功能时,页面底部需要弹出一个抽屉弹窗,点击抽屉上的输入框,会唤起软键盘,由于iOS的软键盘触发方式是将页面滚动,所以导致页面位置偏移 b ...

最新文章

  1. 2022 年计算机视觉的三大趋势
  2. mybatis plus 使用函数_这些Mybatis-Plus使用技巧,太火了
  3. 【组合数学】生成函数 ( 正整数拆分 | 正整数拆分基本模型 | 有限制条件的无序拆分 )
  4. UR #13 Yist
  5. AI驱动的超分辨技术落地实践
  6. thinkphp 第二节
  7. 解决:springcloud 启动 config-client 报错:... .integration.config.HandlerMethodArgumentResolversHolder
  8. 万年历c语言设计报告,C语言实训题目设计报告 万年历
  9. mysql建表时建外键约束_数据库建表时一定要设置外键约束关系吗?
  10. 壁纸控、视觉控少不了高图网解决图片需求问题
  11. 摆脱Wi-Fi信号干扰的对策
  12. WebRTC 的音频弱网对抗之 NACK
  13. 两台电脑如何直接用一根网线传数据?
  14. 自动连上dns服务器啥意思,自动分配DNS服务器和手动设置有什么区别
  15. php入侵检测,PHP入侵检测系统—PHPIDS
  16. 软件测试 | 期末复习——软件质量概述
  17. Java 简单的摇骰子游戏:案例
  18. 零基础转行新媒体运营,有哪些必须要掌握的技能
  19. 动态规划解资源分配问题
  20. upper_bound和lower_bound用法(史上最全)

热门文章

  1. 分治算法求最大最小值c语言,[蓝桥杯][算法提高VIP]和最大子序列 (C语言代码)分治法...
  2. java的基础类型和字节大小_java的基础类型和字节大小
  3. jquery mysql实现加入购物车_jQuery实现加入购物车飞入动画效果
  4. 使用PDF.js实现前端和手机端网页预览PDF文件(可定制,支持本地文件、Base64编码和远程URL跨域方式)
  5. 信息学竞赛计算机基础知识,信息学奥赛-计算机基础知识.doc
  6. php mysql html标签_HTML标签格式化PHP和MySQL
  7. JS实现图片循环滚动
  8. EL表达式, JSTL, 获取map集合中key的value
  9. leetcode83 删除排序链表中的重复元素
  10. Nginx 配置TCP负载均衡