WPF渲染速度慢

NZJ*_*mes 10 wpf performance

我正在尝试提高我在WPF中的树视图的性能,当你打开一个有6000个孩子的节点时,目前显示这个大约需要13秒.我正在为子集合使用observablecollection,其中datatemplate绑定到TransactionViewModel类型,该类型有大约7列,每个列都从视图模型中提取一段数据.

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

所以控件的可视化绘图是即时的,但是第一次打开它时(即使6000个事务视图模型对象已经完全加载到子集合中),纯粹的行渲染就是花费时间.

有趣的是,如果我将datatemplate更改为不绑定到viewmodel对象上的任何依赖项属性并且只输出空白网格,则仍需要8秒钟才能加载.因此,即使没有任何数据绑定调用,树查看器也需要8秒来渲染6000行.额外的5秒然后每行为您提供大约5个绑定数据列,因此与基本渲染相比,这是一个很小的成本.

8s渲染6000行空白对我来说似乎很高.在将XAML从数据模板渲染到树视图中时,是否有任何重大原因可能发生这种情况或需要注意的事项?香港专业教育学院曾尝试使用一个空的数据模板 - 即使它内部甚至没有空白网格,它仍然需要7秒.

鉴于它然后立即崩溃和扩展,为什么它第一次没有呈现任何XAML或调用任何数据绑定时花了这么长时间?

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

非常感谢

jsc*_*edl 12

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

优化性能:控制:

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

  • 链接已经死了..更新了https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/optimizing-performance-controls (2认同)