13

我正在尝试提高我的树视图在 WPF 中的性能,当您打开一个包含 6000 个子节点的节点时,当前显示它大约需要 13 秒。我为子集合使用 observablecollection,数据模板绑定到 TransactionViewModel 类型,该类型有大约 7 列,每列从视图模型中提取一条数据。

创建并实例化了 6000 个子节点的事务视图模型,但由于您还没有直观地显示它们中的任何一个,所以第一次展开节点时,需要 13 秒才能显示。如果您随后收缩并展开节点,它会立即显示,显示/加载时间为零。我能看到的唯一区别是 TransactionviewModel 的每个绑定依赖项属性第一次都有它由 XAML 绑定调用的 getter,而当您第二次重新展开时,这一切都没有发生,因为没有任何改变,所以 WPF 没有再次调用 getter,大概只是将绑定信息保存在内存中,以备第二次扩展时使用。

所以控件的可视化绘制是即时的,但是当你第一次打开它时(即使 6000 个 transactionviewmodel 对象已经完全加载到子集合中),纯粹是行的渲染是需要时间的。

有趣的是,如果我将数据模板更改为不绑定到视图模型对象上的任何依赖项属性并仅输出一个空白网格,则加载仍需要 8 秒。因此,即使没有任何数据绑定调用,树查看器也需要 8 秒来呈现 6000 行。多出 5 秒,然后每行提供大约 5 个绑定数据列,因此与基本渲染相比,这是一个很小的成本。

8s 渲染 6000 个空白行对我来说似乎很高。在将 XAML 从数据模板呈现为树视图时,是否有任何主要原因可能会发生这种情况或需要注意的事项?我试过只使用一个空的数据模板 - 即其中甚至没有一个空白网格,它仍然需要 7 秒。

鉴于它会立即折叠和展开,为什么第一次它甚至没有呈现任何 XAML 或调用任何数据绑定需要这么长时间?

异步调用也不是解决方案,因为我的问题不是 GUI 响应,而是加载数据所花费的时间。用户需要比现在更快地获得数据。

非常感谢

4

3 回答 3

12

在我看来,您需要在 TreeView 中启用虚拟化。

优化性能:控制

默认情况下,当 ListView 和 ListBox 控件的列表项绑定到数据时,它们会启用 UI 虚拟化。可以通过将 VirtualizingStackPanel::IsVirtualizing 附加属性设置为 true 来启用 TreeView 虚拟化

于 2013-01-24T13:40:24.257 回答
3

如果 TreeView 包含许多项,则加载所需的时间可能会导致用户界面出现明显延迟。您可以通过将 VirtualizingStackPanel.IsVirtualizing 附加属性设置为 true 来缩短加载时间。当用户使用鼠标滚轮或拖动滚动条的拇指滚动 TreeView 时,UI 的反应也可能很慢。您可以通过将 VirtualizingStackPanel.VirtualizationMode 附加属性设置为 Recycling 来提高用户滚动时 TreeView 的性能。

如何:提高 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)
于 2016-06-09T04:27:18.690 回答
1

您的问题可能不是渲染而是布局 - 它必须实例化许多 UI 元素以找到它们的大小,以便它可以正确调整许多 UI 元素(滑块)的大小,这需要时间。渲染可能根本不参与其中。

于 2013-01-24T11:46:32.683 回答