我正在努力提高我的树形视图在WPF中的性能,当你打开一个有6000个子节点的节点时,当前大约需要13秒才能显示它。我对子集合使用了一个可观察的集合,数据模板绑定到TransactionViewModel类型,该类型大约有7列,每个列从视图模型中拉入一段数据。
6000个子节点的transactionviewmodels模型已经创建并实例化了,但是由于您还没有可视化地显示它们中的任何一个,所以第一次展开节点时,需要13秒才能显示出来。如果您随后收缩并展开该节点,它将立即显示,显示/加载时间为零。我能看到的唯一区别是,TransactionviewModel的每个绑定依赖属性第一次都有它的getter被XAML绑定调用,当您第二次重新展开时,这些都不会发生,因为什么都没有改变,所以WPF不会再次调用getter,并且可能只是在内存中保存绑定信息,以便您第二次展开它。
因此,控件的可视化绘制是即时的,但当您第一次打开它时(即使6000个transactionviewmodel对象已经完全加载到子集合中),纯粹的行渲染才是最耗时的。
有趣的是,如果我改变数据模板,不绑定到viewmodel对象上的任何依赖属性,而只是输出一个空白网格,它仍然需要8秒才能加载。因此,即使没有任何数据绑定调用,树查看器也需要8秒来呈现6000行。额外的5秒,则每行提供大约5个绑定数据列,因此与基本呈现相比,这是一个很小的成本。
在我看来,用8秒来渲染6000个空白行似乎很高。为什么会发生这种情况,或者从数据模板将XAML呈现为treeview时需要注意的事情,有没有什么主要原因?我试过只使用一个空的数据模板--即使里面没有一个空白的网格,它仍然需要7秒的时间。
假设它随后立即折叠和扩展,为什么它第一次甚至没有呈现任何XAML或调用任何数据绑定时会花费如此长的时间?
此外,异步调用也不是一个解决方案,因为我的问题不是GUI响应,而是加载数据所花费的时间。用户需要比现在更快地获得数据。
非常感谢
发布于 2013-01-24 21:40:24
在我看来,您需要在TreeView中启用虚拟化。
来自Optimizing Performance: Controls
默认情况下,当ListView和ListBox控件的列表项绑定到数据时,将为其启用UI虚拟化。可以通过将VirtualizingStackPanel::IsVirtualizing属性设置为true
来启用TreeView虚拟化
发布于 2016-06-09 12:27:19
如果TreeView包含许多项,则加载所需的时间可能会导致用户界面出现显著延迟。可以通过将VirtualizingStackPanel.IsVirtualizing attached属性设置为true来缩短加载时间。当用户使用鼠标滚轮或拖动滚动条的拇指滚动TreeView时,UI的反应也可能很慢。通过将TreeView attached属性设置为“循环”,可以在用户滚动时提高VirtualizingStackPanel.VirtualizationMode的性能。
How to: Improve the Performance of a TreeView
XAML:
<TreeView Height="200" ItemsSource="{Binding Source={StaticResource dataItems}}" x:Name="myTreeView" 
        VirtualizingStackPanel.IsVirtualizing="True"
        VirtualizingStackPanel.VirtualizationMode="Recycling"/>以编程方式:
myTreeView.SetValue(VirtualizingStackPanel.IsVirtualizingProperty, true);
myTreeView.SetValue(VirtualizingStackPanel.VirtualizationModeProperty, VirtualizationMode.Recycling)发布于 2013-01-24 19:46:33
你的问题可能不是渲染而是布局-它必须实例化很多UI元素来找到它们的大小,这样它才能正确地调整一些UI元素(滑块)的大小,这需要时间。渲染可能根本不会涉及到这一点。
https://stackoverflow.com/questions/14500543
复制相似问题