我正在对使用 PRISM 库编写的 WPF 应用程序进行性能分析。
在此应用程序中,从一个视图导航到另一视图特别慢,尤其是在远离“重”视图时。
注意:
- 来回导航时视图会被缓存并且不会重新构造
(PRISM 将所有视图保留在 SingleActiveRegion 中的结果)
- 我知道由于 xaml 解析、JIT'ing 等原因,第一次构建视图可能会很慢。但是这个问题是关于导航仍然很慢,即使是在第一次打开视图之后
使用 PRISM 库,区域通常在 ContentControl 上实现,例如:
<ContentControl regions:RegionManager.RegionName="MAIN" />
因此,在 MAIN 区域中切换视图将更新此 ContentControl 的“内容”(可以从源代码 https://github.com/PrismLibrary/Prism/blob/a60d38013c02b60807e9287db9ba7f7506af0e84/Source/Wpf/Prism.Wpf/Regions/ContentControlRegionAdapter.cs)。
设置和切换 UI 元素作为 ContentControl 的“内容”会对性能产生副作用(请参阅这篇博文 http://blogs.microsoft.co.il/tomershamam/2009/09/11/wpf-performance-sweets-contentcontrolcontent-null/).
为了克服这种行为,我实现了一个自定义区域适配器库 https://github.com/PrismLibrary/Prism/blob/a60d38013c02b60807e9287db9ba7f7506af0e84/Source/Wpf/Prism.Wpf/Regions/ContentControlRegionAdapter.cs (缓存GridRegionAdapter.cs https://gist.github.com/koenj/ff85dfc2ea13be64cb1094bd2a702faa)对于网格,它基本上添加所有作为子级导航的视图,并隐藏所有非活动视图。
性能提升是巨大的;现在,从一个视图导航到另一个视图是即时的。
问题:这种方法有什么缺点吗?
- 就内存而言,我没有看到问题,因为无论如何所有视图都被 PRISM 保存在内存中
- 拥有一个大的视觉树,其中许多部分具有“可见性”=“折叠”,是否有缺点?
如果还有其他方法可以解决这个问题,请告诉我。
谢谢你的时间,
Koen
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)