【发布时间】:2016-06-29 11:04:19
【问题描述】:
我正在尝试提高我的 WPF 应用程序的性能,但我在使用复杂的 ItemsControl 时遇到了问题。虽然我添加了虚拟化,但仍然存在性能问题,我想我已经找到了原因。
每个项目都包含一系列可扩展区域。因此,用户在开始时会看到摘要,但可以通过展开向下钻取以查看更多信息。下面是它的外观:
如您所见,有一些嵌套的 ItemsControl。所以每个顶级项目都有一堆隐藏控件。虚拟化可防止加载屏幕外项目,但不会阻止项目本身内的隐藏项目。结果,相对简单的初始布局需要大量时间。浏览其中一些视图,87% 的时间用于解析和布局,加载需要几秒钟。
当(如果!)用户决定时,我更希望它需要 200 毫秒来展开,而不是 2 秒来加载整个页面。
真心求教。但是,我想不出使用 MVVM 添加控件的好方法。 WPF 中是否支持任何扩展器或基于可见性的虚拟化,或者我会创建自己的实现?
87% 的数字来自诊断:
【问题讨论】:
-
什么是"隐藏在项目本身中的项目"?虚拟化不会创建
ContentPresenter,但在某个地方你有ObservableCollection<>,它必须完全加载。那么,2s包括什么?您是否进行了分析以了解真正的瓶颈是什么? -
您想虚拟化位于
Expander内的部分项目(对于创建的项目)?如果是,那么您可以在 ViewModel 中处理折叠状态,以便在展开时添加更多数据(例如,使用object保存该数据,使用数据模板在不是null时创建一些视觉效果) . -
这就是布局的方式。您可以延迟获取数据,直到它打开。我很惊讶这需要 2 秒。
-
@ContentPresenter, hidden items = Visibility.Collapsed,显示时设置为可见。这是一个非常好的主意,我可以在可见性状态发生变化时设置可观察的集合,这将非常容易。我会看看它是如何管理的。
-
嗯,我完全移除了扩展器,我面临着相似的加载时间。我添加了一个编辑
标签: c# wpf performance virtualization