使用虚拟化 list或grid
2018-02-02 10:19
197 查看
许多应用程序显示和处理数据集合,如搜索结果列表或者照片。集合非常大时,显示或操作集合时性能可能会降低。为了提高大数据集的性能,你可以使用虚拟化。ItemsControl支持UI和数据虚拟化。
注意: ItemsControl是几个常见集合控件的基类,包括ListView,GridView,FlipView,ListBox和ComboBox控件。这些示例使用ListView和GridView控件,但是这些信息通常适用于ItemsControl
将项目添加到ItemsControl时,该项目被包装在项目容器中。例如,添加到ListView的项目被包装在一个ListViewItem中。如果没有UI虚拟化,整个数据集将保存在内存中,并且还会为数据集中的每个项目创建一个项目容器。一个ListView控件是绑定到的1000个项目的集合也将创造1000个ListViewItem的存储在内存容器。
使用UI虚拟化时,数据集仍保留在内存中,但只有在项目已准备好在UI中显示时才会创建项目容器。使用UI虚拟化的ListView可能只在内存中保留20个ListViewItem对象。当用户滚动列表时,它根据需要创建或重新使用ListViewItem。(ListViewItem对象的数量取决于UI中显示的项目数量。)默认情况下,ItemsControl和派生自其的标准控件支持UI虚拟化。但在某些情况下,UI虚拟化被禁用。我们现在看看这些情况,以便您可以在应用程序设计中做出明智的决定。
在讨论虚拟化时,理解视口的概念或者显示内容的ItemsControl的区域是很重要的。您还需要了解父容器如何影响控件视口的大小。
一些容器限制了他们的孩子的大小。在这里,我们将一个GridView放置在一个Grid中。GridView的视口仅限于父Grid的大小。用户可以使用滚动条将隐藏的项目滚动到视图中。
XAML
复制
其他容器让他们的孩子使用无限的空间来显示他们的内容,即使这个空间超出了容器的可见边界。在这里,我们把同一个GridView放置在一个Canvas中。画布的可见边界以蓝色显示。GridView的视口会增长以适应其所有项目,并延伸到容器的可见边界之外。(这个图像中灰色的项目在实际的应用程序中是不可见的。)没有滚动条,所以用户不能将隐藏的项目滚动到视图中。
XAML
复制
当ItemsControl的视口的大小不受限制时,控件不执行虚拟化。而是为其集合中的每个项目创建一个项目容器。一些不限制视口大小的通用容器是Canvas,StackPanel和ScrollViewer。您可以通过直接设置ItemsControl的大小来启用虚拟化,而不是通过其父容器进行大小设置。
在这里,我们在GridView上设置高度和宽度。这将限制视口的大小,并且视口外的项目被虚拟化。
XAML
复制
一个ItemsControl使用它的ItemsPanel来确定如何在UI中排列项目。您的应用程序设计可能需要您更改默认ItemsPanel为另一个。如果新面板支持UI虚拟化,则控件将继续像以前一样执行虚拟化。标准虚拟化面板包括WrapGrid和VirtualizingStackPanel。
如果使用非虚拟化面板(如VariableSizedWrapGrid或StackPanel)替换ItemsControl中的默认面板,则该控件的UI虚拟化将被禁用。
分组数据不支持UI虚拟化。有关分组数据的更多信息,请参阅如何将列表或网格中的项目分组。如果您需要通过大量分组数据提供快速导航,请考虑使用SemanticZoom控件。有关更多信息,请参阅快速入门:添加SemanticZoom控件。
使用UI虚拟化,完整的数据集存储在内存中。有时,你的数据集非常大,不能或不应该一次存储在内存中。在这种情况下,您可以使用数据虚拟化来获取数据的一个子集。该ItemsControl中仍然可以申请UI虚拟化的数据虚拟化创建的数据子集。
随机访问数据虚拟化让您可以从完整的数据集中的任何位置检索数据的一个子集。例如,如果ListView绑定到100,000个项目的集合,并且用户滚动到集合的中间,则您的应用程序可能只下载50,000-50,050个项目。如果他们然后滚动到列表的末尾,应用程序下载项目99,950
- 100,000。滚动条的滚动指示器或拇指的大小始终是用来表示其在完整100,000项数据集中的位置。
要使用随机访问数据虚拟化,您必须使用实现INotifyCollectionChanged和IObservableVector的数据源。
通过增量数据虚拟化,您的应用可以顺序下载数据。例如,如果ListView绑定到100,000个项目的集合,则您的应用程序可能只下载项目1-50。滚动条的大小可以用来表示它在最初的50个项目数据集中的位置。当用户在列表的末尾滚动时,项目51-100被下载。调整滚动条的大小以表示其在更新的100项目数据集中的位置。
要使用增量数据虚拟化,您必须使用实现ISupportIncrementalLoading的数据源。当您将增量数据虚拟化与ListView或GridView一起使用时,可以使用这些成员来控制数据加载:DataFetchSize,IncrementalLoadingThreshold,IncrementalLoadingTrigger,LoadMoreItemsAsync。
参考MSDN文档UI虚拟化详细说明:https://docs.microsoft.com/en-us/previous-versions/windows/apps/hh780657(v=win.10)
注意: ItemsControl是几个常见集合控件的基类,包括ListView,GridView,FlipView,ListBox和ComboBox控件。这些示例使用ListView和GridView控件,但是这些信息通常适用于ItemsControl
UI虚拟化
将项目添加到ItemsControl时,该项目被包装在项目容器中。例如,添加到ListView的项目被包装在一个ListViewItem中。如果没有UI虚拟化,整个数据集将保存在内存中,并且还会为数据集中的每个项目创建一个项目容器。一个ListView控件是绑定到的1000个项目的集合也将创造1000个ListViewItem的存储在内存容器。使用UI虚拟化时,数据集仍保留在内存中,但只有在项目已准备好在UI中显示时才会创建项目容器。使用UI虚拟化的ListView可能只在内存中保留20个ListViewItem对象。当用户滚动列表时,它根据需要创建或重新使用ListViewItem。(ListViewItem对象的数量取决于UI中显示的项目数量。)默认情况下,ItemsControl和派生自其的标准控件支持UI虚拟化。但在某些情况下,UI虚拟化被禁用。我们现在看看这些情况,以便您可以在应用程序设计中做出明智的决定。
视口大小
在讨论虚拟化时,理解视口的概念或者显示内容的ItemsControl的区域是很重要的。您还需要了解父容器如何影响控件视口的大小。一些容器限制了他们的孩子的大小。在这里,我们将一个GridView放置在一个Grid中。GridView的视口仅限于父Grid的大小。用户可以使用滚动条将隐藏的项目滚动到视图中。
XAML
复制
<Grid Height="400" Width="600"> <GridView Background="DarkGreen" ItemsSource="{Binding}"/> </Grid>
其他容器让他们的孩子使用无限的空间来显示他们的内容,即使这个空间超出了容器的可见边界。在这里,我们把同一个GridView放置在一个Canvas中。画布的可见边界以蓝色显示。GridView的视口会增长以适应其所有项目,并延伸到容器的可见边界之外。(这个图像中灰色的项目在实际的应用程序中是不可见的。)没有滚动条,所以用户不能将隐藏的项目滚动到视图中。
XAML
复制
<Canvas Height="400" Width="600"> <GridView Background="DarkGreen" ItemsSource="{Binding}"/> </Canvas>
当ItemsControl的视口的大小不受限制时,控件不执行虚拟化。而是为其集合中的每个项目创建一个项目容器。一些不限制视口大小的通用容器是Canvas,StackPanel和ScrollViewer。您可以通过直接设置ItemsControl的大小来启用虚拟化,而不是通过其父容器进行大小设置。
在这里,我们在GridView上设置高度和宽度。这将限制视口的大小,并且视口外的项目被虚拟化。
XAML
复制
<Canvas> <GridView Background="DarkGreen" ItemsSource="{Binding}" Height="400" Width="600"/> </Canvas>
ItemsPanel
一个ItemsControl使用它的ItemsPanel来确定如何在UI中排列项目。您的应用程序设计可能需要您更改默认ItemsPanel为另一个。如果新面板支持UI虚拟化,则控件将继续像以前一样执行虚拟化。标准虚拟化面板包括WrapGrid和VirtualizingStackPanel。如果使用非虚拟化面板(如VariableSizedWrapGrid或StackPanel)替换ItemsControl中的默认面板,则该控件的UI虚拟化将被禁用。
分组数据
分组数据不支持UI虚拟化。有关分组数据的更多信息,请参阅如何将列表或网格中的项目分组。如果您需要通过大量分组数据提供快速导航,请考虑使用SemanticZoom控件。有关更多信息,请参阅快速入门:添加SemanticZoom控件。
数据虚拟化
使用UI虚拟化,完整的数据集存储在内存中。有时,你的数据集非常大,不能或不应该一次存储在内存中。在这种情况下,您可以使用数据虚拟化来获取数据的一个子集。该ItemsControl中仍然可以申请UI虚拟化的数据虚拟化创建的数据子集。
随机访问虚拟化
随机访问数据虚拟化让您可以从完整的数据集中的任何位置检索数据的一个子集。例如,如果ListView绑定到100,000个项目的集合,并且用户滚动到集合的中间,则您的应用程序可能只下载50,000-50,050个项目。如果他们然后滚动到列表的末尾,应用程序下载项目99,950- 100,000。滚动条的滚动指示器或拇指的大小始终是用来表示其在完整100,000项数据集中的位置。
要使用随机访问数据虚拟化,您必须使用实现INotifyCollectionChanged和IObservableVector的数据源。
增量虚拟化
通过增量数据虚拟化,您的应用可以顺序下载数据。例如,如果ListView绑定到100,000个项目的集合,则您的应用程序可能只下载项目1-50。滚动条的大小可以用来表示它在最初的50个项目数据集中的位置。当用户在列表的末尾滚动时,项目51-100被下载。调整滚动条的大小以表示其在更新的100项目数据集中的位置。要使用增量数据虚拟化,您必须使用实现ISupportIncrementalLoading的数据源。当您将增量数据虚拟化与ListView或GridView一起使用时,可以使用这些成员来控制数据加载:DataFetchSize,IncrementalLoadingThreshold,IncrementalLoadingTrigger,LoadMoreItemsAsync。
参考MSDN文档UI虚拟化详细说明:https://docs.microsoft.com/en-us/previous-versions/windows/apps/hh780657(v=win.10)
相关文章推荐
- 使用 Microsoft SoftGrid 虚拟化应用程序
- 使用开源Grid平台-GridGain实现网格计算
- Dojo Grid的基本使用 和 表头 出现混乱问题
- 【AngularJs】ui-grid 使用详解
- StateListDrawable的使用
- 仿qq联系人 学习笔记---ExpandableListActivity的使用
- (转)UltraWebGrid使用指南 - 前台事件
- extjs 2.3 Grid使用
- FreeMarker 的 List 的使用
- List--使用List作为堆栈和队列
- KVM虚拟化:使用qemu-kvm创建和管理虚拟机
- struts2的checkbox和checkboxlist两个标签的使用
- Devexpress:在GridControl中使用RepositoryItemGridLookUpEdit
- 学习EXT第四天--开始使用Grid
- dhtmlx使用翻译(八)dhtmlxgrid 保存数据操作 使用后记
- 帝国cms模板list.var使用程序代码
- Android ImageView的setImageLevel和level-list使用简介
- Mac Book 上安装Windows 8 / 10 以后安装 Hyper-v 无法正常使用问题---虚拟化已禁止问题
- python3--list的使用
- WPF使用后台C#代码创建Grid