c# - WPF:缓慢的模板实例化

标签 c# wpf performance templates

我有一个 WPF 应用程序,它很慢。

不是渲染。首先,渲染非常简单,其次,我用 WPF Performance Toolkit 查看了它 - 没什么。

在我自己的代码中。首先,单元测试运行速度很快,其次,如果我将所有 DataTemplates 替换为空白,一切都运行得很快。

到目前为止,看起来比较慢的部分是模板实例化。也就是说,当您启动应用程序并打开一些复杂的屏幕时,会花费很多时间。我所说的“很多”是指“很多”。有时可能长达 3-5 秒 - 例如,当有一个包含 100 行的数据网格时。但是,当您转到另一个选项卡,然后返回同一屏幕时,它会快速打开(只要其 View 模型保持原样)。

这很烦人,不仅因为它很慢,而且因为我对此无能为力。如果我能控制缓慢,我也许可以显示一些“正在打开,请稍候”消息或其他内容...

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

有什么想法吗?有什么经典错误吗?有什么建议吗?

最佳答案

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

几个月前,我们完全重写了中间层以解决我们遇到的性能问题。简而言之,创建我们的用户控件似乎是减慢速度的方式。不幸的是,我找不到一个很好的方法来分析性能,因为 WPF Performance Suite 和商业应用程序(如 ANTS Profiler)都没有为您提供有关 WPF 过程的这一部分的任何详细信息。 (我当时问过this question)

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

最后,我们通过完全重写控件解决了性能问题。我们还大大降低了视觉树的复杂性。在重写之前,我们最常用的用户控件之一,当使用 Snoop 检查时,包含 61 个不同的东西,现在只有 3 个。只要有可能,我们只按需向可视化树中添加东西。 (如您所知,在 XAML 中,即使将内容设置为 Collapsed,也需要先创建它们)。 最后,我们被迫编写自己的富文本呈现控件,因为内置的 RichtextBox 速度非常慢,而且 RichtextBox 的可视化树非常复杂。

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

否则,如果可能的话,虚拟化是你的 friend 。不幸的是,我们无法做到这一点。

关于c# - WPF:缓慢的模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5790380/

相关文章:

c# - 如何在 .net 4 中异步执行 Action

performance - 如何在以下 :/*[fn:name() ="something"] 上提高 Marklogic 7 性能

performance - PDF文档数据表示很慢...如何显示进度?

插入文件时,MySQL 查询速度变慢

c# - SqlCommandBuilder 如何执行它的操作,我如何才能阻止 ReSharper 删除它的建议?

c# - 从 .NET 中的 t 分数计算百分位数

c# - 关于 WPF GetResourceStream

c# - 如何在 WPF 中使用 ContextMenu UserControl?

c# - 如何在 IIS 上运行电报机器人

c# - 在单元测试中输出文本