WPF列表性能提高技术

这篇具有很好参考价值的文章主要介绍了WPF列表性能提高技术。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WPF列表性能提高技术

WPF数据绑定系统不仅需要绑定功能,还需要能够处理大量数据而不会降低显示速度和消耗大量内存,WPF提供了相关的控件以提高性能,所有继承自ItemsControl的控件都支持该技术。

虚拟化

UI虚拟化是列表仅仅为当前显示项创建容器对象的一种技术。例如ListBox控件具有1000条记录,但是每次只能显示30条记录,则ListBox仅仅只创建30个ListBoxItem就可以了。

UI虚拟化技术其实并不是ItemsControl类的实现,而是使用VirtualizingStackPanel容器来实现的,它除了增加虚拟化的支持其他都和StackPanel功能类似。像ListBox、ListView、DataGrid等都是使用了该容器来布局子元素。注意:ComboBox使用的是StackPanel,所以不支持虚拟化,需要自定义ItemsPanelTemplate来实现虚拟化

<ComboBox>
    <ComboBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel/>
        </ItemsPanelTemplate>
    </ComboBox.ItemsPanel>
</ComboBox>

TreeView同样支持虚拟化,但是默认关闭。<TreeView VirtualizingStackPanel.IsVirtualizing="True"/>

破坏虚拟化意外情况

ScrollViewer中放置列表控件

ScrollViewer会提供无限的虚拟空间,但是如果在该虚拟空间中放置列表控件后(如ListBox),ListBox会以完整尺寸渲染本身,然后显示所有的子项,这样每项在内存中都有各自的ListBoxItem对象。其实将ListBox放到任何不限制其尺寸的容器中都有这个问题,比如将ListBox放到StackPanel中。

改变列表控件的模板并且没有使用ItemsPresenter

ItemsPresenter使用了ItemsPanelTemplate,该模板制定了VirtualizingStackPanel面板。

不使用数据绑定

使用编程的方式填充列表不会使用虚拟化。

容器再循环

当滚动支持虚拟化列表时,控件会不断释放旧的对象且创建新的项容器对象。但是启用了容器再循环,则保持少量的Items存活,滚动时加载这些Items,这样垃圾收集器不需要查找旧的对象并释放。默认DataGrid开启该特性。其他控件需自行设定。

<ListBox VirtualizingStackPanel.VirtualizationMode="Recycling"/>

缓存长度

VirtualizingStackPanel其实会多创建几个超过显示范围的子项,以便于滚动时直接显示。可以使用CacheLengthCacheLengthUnit调整缓存精度。缓存是以优先级较低的后台线程上进行缓存。

<!--缓存可见项之前和之后的附加页-->
<ListBox VirtualizingStackPanel.CacheLength="1" VirtualizingStackPanel.CacheLengthUnit="Page"/>
<!--缓存可见项之前和之后的100项-->
<ListBox VirtualizingStackPanel.CacheLength="100" VirtualizingStackPanel.CacheLengthUnit="Item"/>
<!--缓存可见项之前100,之后500项-->
<ListBox VirtualizingStackPanel.CacheLength="100,500" VirtualizingStackPanel.CacheLengthUnit="Item"/>

延迟滚动

延迟滚动可以让用户在滚动条上拖动滑块时不会更新列表显示。只有当用户释放了滑块后才刷新。

<ListBox ScrollViewer.IsDeferredScrollingEnabled="True"/>

VirtualizingStackPanel默认是基于项的滚动,也就是至少滚动显示出一个完整项目,可以自行设置是基于项的滚动还是像素的滚动。

<ListBox VirtualizingStackPanel.ScrollUnit="Pixel"/>

注意:ItemsControl本身默认不启用虚拟化

为ItemsControl开启虚拟化参考ItemsControl的常见用法最后一章节文章来源地址https://www.toymoban.com/news/detail-725735.html

到了这里,关于WPF列表性能提高技术的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【WPF系列】- XAML语法规范

    定义XAML语法术语是XAML语言规范中进行定义或引用。XAML是基于XML的语言,遵循或扩展XML结构规则。XAML是基于描述XML语言或XML文档对象模型时常用的术语。 XAML是一种标记语言。CLR是可实现运行时语言。XAML不是CRL运行一部分。仅是使用于WPF的XAML时实例化运行的一种表达形式。

    2024年02月05日
    浏览(45)
  • WPF: XAML语法规范详解

    WPF(Windows Presentation Foundation)是.NET框架的一个组成部分,用于构建桌面应用程序的用户界面。XAML(Extensible Application Markup Language)是一种基于XML的标记语言,用于定义WPF应用程序的界面和逻辑。 XAML文件扩展名为.xaml,它是一种XML格式的文件。XAML文件通常包含以下部分: x

    2024年04月23日
    浏览(35)
  • 【wpf】xaml 中的参数复用

    xaml中有几种复用的方式: 有时在xaml中,我们需要复用一些参数,比如 固定的一个值。 有时是固定的一个样式。 有时多个控件都要设置一个高度,我可以引入sys 我就使用这个吧: xmlns:sys=\\\"clr-namespace:System;assembly=mscorlib\\\" 用的更多的其实是margin,我们试一试: 这里 mm 用的是

    2024年02月07日
    浏览(78)
  • WPF XAML中使用依赖属性

    自定义的控件 MyCustomControl ,它有一个依赖属性 MyProperty 。首先,我们需要在控件的代码文件中创建这个依赖属性: 在XAML文件中使用这个控件及其依赖属性: 在这个例子中, local 是XAML文件中定义的XML命名空间前缀, clr-namespace:WpfApp 指定了 MyCustomControl 定义所在的命名空间。

    2024年02月20日
    浏览(41)
  • Microsoft.Xaml.Behaviors.Wpf 的使用

    System.Windows.Interactivity.WPF这个已经过时,可以使用 Microsoft.Xaml.Behaviors.Wpf ,基本使用查不多,

    2024年02月13日
    浏览(48)
  • WPF国际化的实现方法(WpfExtensions.Xaml)

    https://blog.csdn.net/eyupaopao/article/details/120090431 resx资源文件实现 resx资源文件,实现的过程比第一种复杂,但resx文件本身编辑比较简单,维护起来比较方便。需要用到的框架:WpfExtensions.Xaml 为每种语言添加.resx资源文件,放在I18nResource文件夹下 I18nResource.resx 代表英语,名字不要

    2024年02月12日
    浏览(32)
  • 二、深入浅出WPF之系统学习XAML语法

    跟Winforms一样,UI也是个平面结构,与winforms的设计思维不同,WPF使用树形逻辑来描述UI,下面是UI布局的简单代码 实际的页面效果:

    2024年02月16日
    浏览(49)
  • 【.NET深呼吸】将XAML放到WPF程序之外

    上一篇水文中,老周说了一下纯代码编写 WPF 的大概过程。不过,还是不够的,本篇水文中咱们还要更进一步。 XAML 文件默认是作为资源打包进程序中的,而纯代码编写又导致一些常改动的东西变成硬编码了。为了取得二者平衡,咱们还要把一些经常修改的东西放到 XAML 文件

    2024年02月09日
    浏览(39)
  • WPF绘图指南:用XAML轻松实现圆、线、矩形、文字、图片创意元素

      概述: 在WPF中,通过使用不同的元素如Ellipse、Line、Rectangle等,可以轻松绘制各种图形,包括圆、线条、椭圆、矩形、多边形等。同时,通过TextBlock展示文字,Image展示图片,以及Path创建路径和曲线,使得图形的绘制变得灵活多样。通过简单的XAML代码,开发者可以快速构建

    2024年03月13日
    浏览(46)
  • WPF实现更加灵活绑定复杂Command(使用Microsoft XAML Behaviors 库)

    1、安装NuGet          2、在XAML的命名空间引入: 3、使用(这里是设置了一个Canvas的点击事件,其它面板也是类似这样设置):         --我这里的ViewModel部分是这样子的 4、这样就可以在ViewModel中直接给这个Command内容了,不用像之前那么麻烦地绑定Command了,这样更加清晰,

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包