WPF:慢速模板实例化

Fyo*_*kin 23 c# wpf performance templates

我有一个WPF应用程序,而且速度很慢.

不是渲染.首先,渲染非常简单,其次,我使用WPF Performance Toolkit查看它 - 没有.

不在我自己的代码中.首先,单元测试工作很快,其次,如果我用空白替换所有DataTemplates,一切都很快.

到目前为止,看起来缓慢的部分是模板实例化.也就是说,当你启动应用程序并打开一些复杂的屏幕时,需要花费很多时间.而且" 很多 "我的意思是" 很多 ".有时可能长达3-5秒 - 例如,当有一个包含100行的数据网格时.但是当你转到另一个标签,然后回到同一个屏幕时,它会快速打开(只要它的视图模型保持不变).

这非常烦人,不仅因为它很慢,而且因为我无能为力.如果我对缓慢有一些控制,我可能会显示一些" 开放,请等待 "的消息或某些东西......

此外,当我查看其他一些WPF应用程序(最值得注意的是,ILSpy)时,尽管数据量很大,但它们似乎工作得相当快.这让我相信我可能做错了什么.但我不知道从哪里开始.

有任何想法吗?任何经典错误?有小费吗?

Pat*_*lug 5

我的经验来自于WPF思维导图应用程序NovaMind的工作

几个月前,我们完全重写了我们的中间层,以解决我们遇到的性能问题.简而言之,创建用户控件似乎是放慢速度的方法.遗憾的是,由于WPF Performance Suite和ANTS Profiler等商业应用程序都没有为WPF流程的这一部分提供任何详细信息,因此无法找到一种很好的方式来分析性能.(那时我问了这个问题)

我们通过反复试验手动测试我们的应用程序,并删除了部分用户控件,以确定究竟是什么罪魁祸首.

最后,我们通过完全重写控件来解决性能问题.我们还大大降低了视觉树的复杂性.在重写之前,我们最常用的用户控件之一,在使用Snoop进行检查时,由61个不同的东西组成,现在只有3个.只要有可能,我们只会根据需要向可视化树添加内容.(正如您在XAML中所知,即使您将事物设置为Collapsed,也需要先创建它们).最后,我们被迫编写自己的富文本渲染控件,因为内置的RichtextBox非常慢,RichtextBox的可视树非常复杂.

我不知道这是否适用于您的情况,但我建议您调查用户控件并查看它们是否复杂.也许你有可以修剪的东西.低悬的水果将是很少可见的部分,或者可以以懒惰的方式创建.您可以在必要时从代码后面创建这些部分,而不是在XAML中使用它们.这应该会对你有所帮助.

否则,如果可能,虚拟化是您的朋友.在我们的案例中,遗憾的是我们无法做到这一点.