【问题标题】:Style inheritance performance in wpfwpf中的样式继承性能
【发布时间】:2011-08-11 15:45:52
【问题描述】:

假设我有 10000 个样式非常重的 WPF 控件,并且它们的样式大约 90% 相同。

我想知道:在性能方面,最好的方法是什么?

  1. 拥有 10000 种独特的风格
  2. 有 1 个样式包含常见的 90% + 10000 个样式继承此样式并添加剩余的 10%

我没有再三考虑就选择了第二个选项(出于可读性考虑),但我进行了一些基本测试,结果表明这在性能方面是一个非常糟糕的主意。那么我的测试有问题吗,还是样式继承真的会降低性能?

编辑:好的,我几乎可以肯定这没有得到足够好的解释。我会尽量详细一点:

基本上,我关心的是DataGrid。 我的单元格是高度可定制的(基本上,您可以更改单元格中的每个样式属性),并且由于 datagrid 不允许轻松完成此操作(感谢 datagridcell 的 datacontext 是 rowView 而不是 CellView),所以我做了一些事情实现我要添加的功能真的很难看(如果您想了解详细信息,请参阅there)。它基本上包括在每个单元格的代码隐藏中设置 CellStyle。

由于这些样式有很多共同点,我尝试设置一个通用样式,放入我的应用程序的静态资源,并将我的所有单元格样式都基于这个通用样式。 (除其他外,此样式托管事件侦听器,而 cellStyles 将绑定添加到诸如前景颜色、FontSize 等属性...)

当我尝试这样做时,我注意到数据网格的性能大幅下降。 现在,由于当时我并没有真正测试应用程序的这一面,可能只是代码的某些部分写得不好,性能下降与我使用“基于”样式无关。无论如何,我回滚并完成了我正在进行的测试。

现在,我正在整理我的代码,我再次考虑这个问题。 在麻烦再次更改我所有的样式结构之前,如果只是为了测试目的,我想我会先在这里问一下是否值得麻烦......没有更多的事情......

感谢您的帮助!

【问题讨论】:

  • 它们是作为 StaticResource 还是 DynamicResource 访问的?
  • 你做了什么样的测试?可以发一下代码吗?
  • 我认为这取决于您如何加载资源。你在使用 ResourceDictionary 对象吗?
  • 只是出于好奇,这背后的背景是什么?如果这 10% 的差异与数据相关,你不能只用触发器或其他东西来做差异吗?
  • 感谢您对我的问题感兴趣(我很惊讶它得到了这么多),请参阅我的编辑了解更多详情

标签: wpf performance styles


【解决方案1】:

我肯定会说后者。将共性归结为“可继承”的风格可能是最好的。至少在运行时加载这些样式在磁盘时间方面会更快。即使每个子样式都有一堆设置器,但如果有这么多的设置器,那么阅读时间就会少于 10,000 个完全指定的样式,它们相当于同一个控件。尽管还有另外 10% 的差异化,有没有一种方法可以将这些差异也归结为样式集?

您可以拥有基于样式的样式...

此外,您可以在这些项目上将一些事情推到触发器上吗?假设您有 10000 种可能的所有样式设置组合。如果您可以将其中一些触发器移至多个触发器,似乎会减少您需要的样式选择数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2012-12-17
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多