WPF中的数据虚拟化

背景

UI虚拟化

当一个WPF的ItemControl被绑定到一个大型集合的数据源时,如果可以UI虚拟化,该控件将只为那些在可以看到的项创见可视化的容器(加上面和下面的少许)。这是一个完整集合中有代表性的一小部分。用户移动滚动条时,将为那些滚动到可视区域的项创建新的可视化容器,那些不再可见的项的容器将被销毁。当容器设置为循环使用时,它将再使用可视化容器代替不断的创建和销毁可视化容器,避免对象的实例化和垃圾回收器的过度工作。

数据虚拟化

数据虚拟化是指绑定到ItemControl的真实的数据对象的归档虚拟化的时间段。数据虚拟化不是由WPF提供的。作为对比,基本数据对象的小集合对内存的消耗不是很多;但是,大集合的内存消耗是非常严重的。另外,真实的检索数据(例如,从数据库)和实例化数据对象是很耗时的,尤其当是网络数据调用时。因此,我们希望使用数据虚拟化机制来限制检索的数据的数量和在内存中生成数据对象的数量。

解决方案

总览

这个解决方案是只在ItemControl绑定到IList接口的实现时起作用,而不是IEumerable的实现,它并不枚举整个列表,而只是读取需要显示的项。它使用Count属性判断集合的大小,推测并设置滚动的范围。然后使用列表索引重新确定要在屏幕上显示的项。因此,创建一个可以报告具有大量项的,并且可以只检索需要的项的IList。

IItemsProvider<T>

为了利用这个解决方案,下面的数据源必须能提供集合中项的数量,并且能够提供完整集合的小块(或页)。这需要在IItemsProvider接口封装。

/// <summary>/// Represents a provider of collection details./// </summary>/// <typeparam name="T">The type of items in the collection.</typeparam>public interface IItemsProvider<T>{    /// <summary>    /// Fetches the total number of items available.    /// </summary>    /// <returns></returns>    int FetchCount();

/// <summary>    /// Fetches a range of items.    /// </summary>    /// <param name="startIndex">The start index.</param>    /// <param name="count">The number of items to fetch.</param>    /// <returns></returns>    IList<T> FetchRange(int startIndex, int count);}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据
, 对象
, 可视化
, 容器
, 滚动
, 一个
, 容器虚拟化技巧
判断可视区域
wpf 数据虚拟化、wpf 虚拟化、wpf listbox 虚拟化、wpf ui虚拟化、wpf datagrid 虚拟化,以便于您获取更多的相关知识。

时间: 2024-08-01 09:16:06

WPF中的数据虚拟化的相关文章

OEA 中 WPF 树型表格虚拟化设计方案

    最近用 OEA 做的仓库管理系统中,许多界面的都需要使用表格控件来显示数据.一是这些表格的列非常多,有的甚至达到了 200 列,而且一个模块的界面中可能同时显示好几个表格.这导致界面的速度比较慢,特别是较多数据需要展现时.经检测,表现虽然表格的行已经做了虚拟化,但是由于列非常多,最终还是造成可视树中的元素过多,而导致界面布局代码运行过慢.假设只有 30 行,一个单元格仅生成 5 个可视元素,200 列的单元格都会产生 3W 个可视元素,而布局系统的 Measure 方法需要对可视树中的每

WPF中xaml与xml交换数据时设计器中有数据,但运行后没有,为什么额?

问题描述 WPF中xaml与xml交换数据时设计器中有数据,但运行后没有,为什么额? 4C 在项目中创建了一个新的窗口叫window1然后在母窗口的cs文件中设置button按钮点击事件: window1 mywin = new window1(); mywin.show(); 在window1的xaml中绑定了当前目录的一个xml文件,设计器上可以看到绑定之后的数据,但是一旦运行之后,点击button按钮,出现window1的界面就会没有那些绑定的数据,敢问这是怎么回事呢? 谢谢: 其实就是设

wpf 怎样用数据库中的数据直接生成treeview?

问题描述 wpf 怎样用数据库中的数据直接生成treeview? 数据库表: 表: id name parentId 1 A -1 2 B 1 3 C 1 4 D 2 parentId=-1表示根节点 在treeview中A是根节点,B.D是A的节点,C是B的节点 希望可以直接将数据库中的二维结构表生成treeview,并添加删除节点,在wpf中应该怎样实现呢?试了很久一直没成功,希望各位前辈老师能帮忙解答,谢谢!

如何在 Docker 容器中运行支持 OData 的 JBoss 数据虚拟化 GA

大家好,我们今天来学习如何在一个 Docker 容器中运行支持 OData(译者注:Open Data Protocol,开放数据协议) 的 JBoss 数据虚拟化 6.0.0 GA(译者注:GA,General Availability,具体定义可以查看WIKI).JBoss 数据虚拟化是数据提供和集成解决方案平台,将多种分散的数据源转换为一种数据源统一对待,在正确的时间将所需数据传递给任意的应用或者用户.JBoss 数据虚拟化可以帮助我们将数据快速组合和转换为可重用的商业友好的数据模型,通过

WPF中如何使用行为示例:Canvas控件拖放行为的演示

1.获取行为的支持,安装Expression Blend 4 SDK(http://www.microsoft.com/zh-cn/download/details.aspx?id=10801) . 2.创建行为库 (1)创建一个Class Project,添加WPF必备的以及WPF中支持行为必备的dll文件. 其中,System.Windows.Interactivity.dll组件在目录(需要安装Blend SDKs):C:\Program Files (x86)\Microsoft SDK

WPF 中 ICollectionView 及 ItemsControl 相关的重点

为 OEA 框架 做 WPF 树型表格控件时,浪费了许多时间在一些知识点上,所以写了这篇博客总结一下,和各位博友分享.   ICollectionView 接口的简易使用方法   它的 SortDescriptions.GroupDescription 等属性会影响视图的结构,一般情况下会自动刷新. 也可以直接使用 Refresh 方法来命令视图的刷新(内部实现一般为重建内部视图模型集合). 如果是批量操作,也可以使用 RefreshDefer 方法来抑制多次刷新,待多个更新操作后再统一刷新.

WPF MultiBinding 给数据目标赋值后绑定无效的问题

近来用WPF制作做了一个IP控件的试验,IP数值通过TextBox输入(也可以定制0-254的输入),需要4个TextBox多路绑定至System.Net.IPAddress,如图前4个TextBox作为数值输入,多路绑定至IPAddress, 最后一个TextBox绑定了IPAddress,且依赖项属性IPAddressProperty 变化时会引发函数IPAddressChangedCallback,从而改变前4个TextBox. 前4个TextBox的多路绑定以TextBox为数据源,IP

什么是数据虚拟化软件?

HealthNow公司在众多的产品中选择了Informatica数据虚拟化软件,而其竞争对手 IBM和Composite等"纷纷落马".公司管理者透露,选择Informatica主要是因为它需要更少的SQL编码,而且提高了保险供应商的数据质量策略. Rob Myers是HealthNow公司一位企业数据仓库解决方案架构师,他说:"我不喜欢IBM和Composite的原因之一就是它们更多是由代码驱动的.基本上你必须编写许多SQL,或者它只会生成SQL映射,而不是像Informa

大数据虚拟化零起点(七) 安装Big Data Extensions Plugin

今天我们就将实现大数据虚拟化POC环境的零起点部署.在下面的文章内容中,我将通过6个步骤,带领大家完成BigData Extensions Plugin的安装.具体步骤如下: 1.在浏览器打开Big Data Extensions的plugin注册界面: 输入URL http://<serengeti-mgmt-server's-ip-address:8080/register-plugin,选择Install.如下图所示: 2.输入vCenter Server的IP地址(注意不要在IP前加ht