[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中实例化出来了。

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

感谢您的阅读。

时间: 2024-07-31 14:33:20

[WPF]WPF Data Virtualization和UI Virtualization的相关文章

WPF案例 (六) 动态切换UI布局

原文:WPF案例 (六) 动态切换UI布局 这个Wpf示例对同一个界面支持以ListView或者CardView的布局方式呈现界面,使用控件ItemsControl绑定数据源,使用DataTemplate为ItemsControl分别预定义了ListView和CardView的样式,在程序运行时,可在这两种Layout之间互相切换,界面如下.源代码在这里下载   为ItemsControl定义ListView UI布局的ItemTemplate,并指定MouseOver时DataTemplate

在WPF中减少逻辑与UI元素的耦合

原文:在WPF中减少逻辑与UI元素的耦合             在WPF中减少逻辑与UI元素的耦合 周银辉 1,    避免在逻辑中引用界面元素,别把后台数据强加给UI  一个糟糕的案例 比如说主界面上有一个显示当前任务状态的标签label_TaskState,我们会时常更新该标签以便及时地将任务状态通知用户.那么很糟糕的一种假设是我们的代码中会到处充斥着这样的语句段this.label_TaskState .Content = this.GetStateDescription(TaskSta

[WPF自定义控件]?Window(窗体)的UI元素及行为

原文:[WPF自定义控件]?Window(窗体)的UI元素及行为 1. 前言 本来打算写一篇<自定义Window>的文章,但写着写着发觉内容太多,所以还是把使用WindowChrome自定义Window需要用到的部分基础知识独立出来,于是就形成了这篇文章. 无论是桌面编程还是日常使用,Window(窗体)都是最常接触的UI元素之一,既然Window这么重要那么多了解一些也没有坏处. 2.标准Window 这篇文章主要讨论标准的Window,不包括奇形怪状的无边框.非矩形Window,即只讨论W

拒绝卡顿——在WPF中使用多线程更新UI

有经验的程序员们都知道:不能在UI线程上进行耗时操作,那样会造成界面卡顿,如下就是一个简单的示例: ????public partial class MainWindow : Window????{????????public MainWindow()????????{????????????InitializeComponent();????????????this.Dispatcher.Invoke(new Action(()=> { }));????????????this.Loaded

深入浅出WPF之Data Converter--笔记(2015.03.09)

BInding还有另外一种机制称为数据转换(Data Convert),当Source端Path所关联的数据与Target端目标属性数据类型不一致时,可以数据转换器(Data Converter).当WPF不能自动转换数据类型时,只能自己写Converter,方法是创建一个类并让这个类实现IValueConverter接口.当数据从Binding的Source流向Target时,Convert方法将被调用:反之,ConvertBack方法将被调用. BInding对象的Mode属性会影响到这两个

[WPF系列]-Data Validation

项目经常前台界面涉及到用户输入时,我们常常会用到数据有效性的验证.在网页中我们之前用js来校验Form中的数据有效性.在WPF中我们如何实现这种验证机制了?答案:INotifyDataErrorInfo   INotifyDataErrorInfo简介 如图示该接口有三件宝贝: HasErrors: a read-only boolean property which tells if the object as a whole have any validation errors; GetEr

一种WPF在后台线程更新UI界面的简便方法

WPF框架规定只有UI线程(主线程)可以更新界面,所有其他后台线程无法直接更新界面.幸好,WPF提供的SynchronizationContext类以及C#的Lambda表达式提供了一种方便的解决方法.以下是代码: public static SynchronizationContext s_SC = Synchronization.Current; //主窗口类的静态成员 在App类中: static Thread s_MainThread = Thread.CurrentThread; //

WPF 皮肤之MathApps.Metro UI库

在WPF中要想使用Metro风格是很简单的,可以自己画嘛.. 但是为了节省时间,哈,今天给大家推荐一款国外Metro风格的控件库. 本文只起到抛砖引玉的作用,有兴趣还是推荐大家上官网,Thanks,官网地址 我会在底部发出. 使用步骤 一.使用Nuget包管理,添加引用 Install-Package MahApps.Metro 或者使用界面管理: 二.修改App.xaml文件,引用资源 <Application x:Class="MetroWPF.App" xmlns=&quo

WPF 修改数据后更新UI

ObservableCollection<T> 只有项添加或删除才会更新UI 要想属性发生变动后立刻更新到UI,必须继承 INotifyPropertyChanged 接口,示例如下 public class SurfaceDetail: INotifyPropertyChanged { //不更新到界面的属性 public string name { get; set; } //以下是更新到界面的属性 private string _color; public string color {