C# 如何提高ContentControl卸载性能

C# 如何提高ContentControl卸载性能,c#,wpf,C#,Wpf,我正在使用MVVM和ViewModel-First方法开发一个WPF应用程序。在ViewModel中进行页面导航的一种常见方法是首先将ViewModel设置为ContentControl的内容。通过使用DataTemplates,可以呈现正确的视图 当要替换的视图具有复杂的可视树时,替换ContentControls内容可能会导致性能问题。它需要被卸载,这意味着整个树被递归清理。本文对此进行了详细解释。我注意到这取决于设备,但卸载复杂页面的时间可能长达10秒 我目前找到了两种解决此问题的方法:

我正在使用MVVM和ViewModel-First方法开发一个WPF应用程序。在ViewModel中进行页面导航的一种常见方法是首先将ViewModel设置为ContentControl的内容。通过使用DataTemplates,可以呈现正确的视图

当要替换的视图具有复杂的可视树时,替换ContentControls内容可能会导致性能问题。它需要被卸载,这意味着整个树被递归清理。本文对此进行了详细解释。我注意到这取决于设备,但卸载复杂页面的时间可能长达10秒

我目前找到了两种解决此问题的方法:

  • 使用较小的视图或将控件与虚拟化结合使用:通过将视图拆分为不同的页面或使用TabControl,可以解决问题(部分)。然而问题仍然存在,什么时候视图变得太大
  • 使用包含以前所有页面的ItemsControl,因此无需卸载。提出并验证了该解决方案。此解决方案可能与遍历可视化和逻辑树的代码有缺点,并且可能会导致其他性能问题,因为以前的所有视图都存储在内存中

  • 卸载ContentControl的性能能否在不产生上述解决方案的情况下得到改善?

    我使用的是2。没有问题的选择。WPF视图可能会占用大量内存。有时清除ItemsControl绑定到的ViewModels列表,并调用GC(或等待它)可以解决此问题。10秒。。。太多了!尝试分析这是最耗时的操作,或者删除部分UI,并检查它如何影响加载/卸载时间。我曾经遇到过这样一个非常严重的问题,发现一个小图标有无数条不透明的路径。。。