zoukankan      html  css  js  c++  java
  • [WPF]WPF Data Virtualization和UI Virtualization

    这篇博客将介绍WPF中的虚拟化技术。

    1. Data Virtualization 通常情况下我们说数据虚拟化是指数据源没有完全加载,仅加载当前需要显示的数据呈现给用户。这种场景会让我们想到数据分页显示,当需要特定页面的数据时,根据页数请求相应数据。

    WPF没有提供对Data Virtualization原生态的支持,当时我们可以使用Paging相关技术来实现。在我先前的博客WPF 实现 DataGrid/ListView 分页控件中有介绍。

    2. UI Virtualization 是针对数据容器渲染数据项的一个优化。举个例子,一个ListView/ListBox控件中有10000个Item,但是可见的只有10个,那么此时只渲染并显示这10个Item,剩余的9990个Item不实例化和显示。这样可以提高程序的性能。

    WPF中VirtualizingStackPanel容器是实现了UI Virtualization的容器,VirtualizingStackPanel也是ListBox/ListView的默认数据容器。

    下面通过一个例子来展示开启UI 虚拟化和关闭UI 虚拟化对程序性能产生的影响。

    <ListView x:Name="VirtualizationListView" 
              VirtualizingPanel.VirtualizationMode="Recycling"
              VirtualizingPanel.IsVirtualizing="True"/>
    public MainWindow()
    {
        InitializeComponent();
    
        this.Loaded += delegate
        {
            List<string> items = new List<string>();
    
            for (int i = 0; i < 10000; i++)
            {
                items.Add(string.Concat("item", i));
            }
    
            this.VirtualizationListView.ItemsSource = items;
        };
    }

    此时当通过Scrollbar滚动时,内存的波动不明显。

    VirtualizingPanel.VirtualizationMode="Recycling"表示不循环实例化新的Item,例如Item1--Item20此时可见,拖动滚动条到Item100,再从Item100返回至Item1--Item20时,这时候Item1--Item20不会被重新实例化。默认情况下 VirtualizingPanel.VirtualizationMode="Standard"。在ListView进行滚动时,内存会用增加。

    当关闭UI虚拟化之后,内存的变化非常显著,因为程序初始化时就将这10000条数据全部在ListView中实例化出来了。

    当遇到上述场景时,可以合理的使用虚拟化技术来提高程序的性能。

    感谢您的阅读。

  • 相关阅读:
    上网助手(集成ipv6)windows版
    c# 串口编程
    test blog
    用于主题检测的临时日志(d020b283408c4bc68872f97ee237b663 3bfe001a32de4114a6b44005b770f6d7)
    OpenGL概述 陌陌
    [转载][转帖]谈谈我对攻读计算机研究生的看法。。。大牛的文章,见解精深独到
    滚动值的兼容问题
    js小练习去掉指定的字符组成一句话输出
    马虎将classname加到了id属性中,造成报错
    锋利的jquery读书笔记(一)
  • 原文地址:https://www.cnblogs.com/yang-fei/p/6139723.html
Copyright © 2011-2022 走看看