我正在尝试提高我在WPF中的树视图的性能,当你打开一个有6000个孩子的节点时,目前显示这个大约需要13秒。我正在为子集合使用observablecollection,其中datatemplate绑定到TransactionViewModel类型,该类型有大约7列,每个列都从视图模型中提取一段数据。
创建并实例化了6000个子项的事务视图模型,但由于您还没有直观地显示它们,因此第一次展开节点时,需要13秒才能显示。如果然后收缩并展开节点,它会立即显示零时间显示/加载。我可以看到的唯一区别是,第一次TransactionviewModel的每个绑定依赖项属性都有XAML绑定调用它的getter,当你第二次重新扩展时,没有一个发生,因为没有任何改变,所以WPF没有再次调用getter,并且可能只是在第二次展开时将内存中的绑定信息保存在内存中。
因此控件的可视化绘图是即时的,但是第一次打开它时(即使6000个事务视图模型对象已经完全加载到子集合中),纯粹的行渲染就是花费时间。< / p>
有趣的是,如果我将datatemplate更改为不绑定到viewmodel对象上的任何依赖项属性并且只输出空白网格,则仍需要8秒钟才能加载。因此,即使没有任何数据绑定调用,树查看器也需要8秒来渲染6000行。额外的5秒然后每行为您提供大约5个绑定数据列,因此与基本渲染相比,这是一个很小的成本。
8s渲染6000个空白行对我来说似乎很高。在将XAML从数据模板渲染到树视图中时,是否有任何重大原因可能发生这种情况或需要注意的事项?香港专业教育学院曾尝试使用一个空的数据模板 - 即使它内部甚至没有空白网格,它仍然需要7秒。
鉴于它会立即崩溃和扩展,为什么第一次它甚至没有呈现任何XAML或调用任何数据绑定时需要这么长时间?
Asynch调用也不是解决方案,因为我的问题不是GUI响应,而是加载数据所花费的时间。用户需要比现在更快地获得数据。
非常感谢
答案 0 :(得分:11)
在我看来,您需要在TreeView中启用虚拟化。
来自Optimizing Performance: Controls:
默认情况下,为ListView和ListBox启用UI虚拟化 控制何时列表项绑定到数据。树视图 可以通过设置来启用虚拟化 VirtualizingStackPanel :: IsVirtualizing附加属性为true
答案 1 :(得分:3)
如果TreeView包含许多项目,则加载所需的时间可能会导致用户界面出现明显延迟。您可以通过将VirtualizingStackPanel.IsVirtualizing附加属性设置为true来缩短加载时间。当用户使用鼠标滚轮或拖动滚动条的拇指滚动TreeView时,UI可能也会很慢。当用户通过将VirtualizingStackPanel.VirtualizationMode附加属性设置为Recycling来滚动时,可以提高TreeView的性能。
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)
答案 2 :(得分:1)
你的问题很可能不是渲染而是布局 - 它必须实例化很多UI元素才能找到它们的大小,这样才能正确调整大量UI元素(滑块)的大小,这需要时间。渲染很可能根本不会进入。