【问题标题】:WPF Performance using ResourceDictionary使用 ResourceDictionary 的 WPF 性能
【发布时间】:2017-12-17 13:07:14
【问题描述】:

在我的 WPF 应用程序中,我有很多 XAML,所以我对在 WPF 中使用 ResourceDictionary 有点困惑,使用它是让我的应用程序禁食还是减慢它。

EX:假设我们有一个 TextBlock 的以下样式,我们想将它应用到我的应用程序中的许多 TextBlock 中:

<Style TargetType="{x:Type TextBlock}" x:Key="MainText">
            <Setter Property="FontSize" Value="12" />
            <Setter Property="Height" Value="20" />
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="FontFamily" Value="Droid Arabic Kufi" />
            <Setter Property="Foreground" Value="#FF383838"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
</Style>

什么是我的应用程序性能的最佳方法,像上面一样在 ResourceDictionary 中声明样式并使用如下:

<TextBlock Style="{StaticResource MainText}" Text="Hello"/>

或者在每个中重复样式(FontWeight、FontFamily、Foreground ...)?

提前致谢

【问题讨论】:

  • 不应该有明显的性能差异。这只是为了方便(不必手动重新应用每个控件上的所有属性)
  • 但是如果你真的想知道,手动设置所有属性在启动时可能会稍微快一些(因为你删除了一个间接级别)。一旦控件加载完毕,应该不会再有区别了(因为所有属性的值都已解析)
  • 性能上不会有任何明显的差异(如果有的话)。但是,在样式中设置一次属性并将该样式用于许多控件会显着改善应用程序设计。
  • 实际上,资源字典可以成为你最好的朋友,因为一旦只用作应用程序资源,将给你最好的性能和内存消耗,但你需要使用 ResourceKey 来获得。但是,如果您有大量的字典,最终会导致速度变慢并占用更大的内存。
  • @AlexSeleznyov 请您提供有关 ResourceKey 的更多详细信息吗?提前致谢

标签: c# wpf xaml resourcedictionary staticresource


【解决方案1】:

以这种方式使用它并没有性能差异。 ResourceDictionaries 的性能压力仅在视图初始化时使用。造成压力的原因是因为它先向内然后向外寻找资源,直到找到该密钥的第一个。因此,如果资源在控件中,那么它会更快地找到,然后它会搜索该控件的父级,依此类推到 Window(通常是 MainWindow),最后是 Application。 (这意味着资源越接近控件,它被发现和使用的速度就越快。但速度不是问题。只有在应用程序级别具有大量共享 ResourceDictionary 的应用程序中才会真正成为问题。)

有一些非常有效和巧妙的方法可以绕过这个限制,但这不是问题,除非您的视图仅基于此而缓慢呈现。一旦视图被渲染,它就直接引用了源,并且没有更多的检查。现在,如果创建了控件,而视图已经呈现,例如 ItemsControl 中的模板,并且模板正在引用这些资源,那么列表可能会显示更新和其他类似性质的惩罚。

直截了当...不要担心性能,除非 ResourceDictionary 位于 App 级别并且您有很多。

【讨论】:

  • 我想说恰恰相反。您应该在视图级别避免ResourceDictionary - 不惜一切代价。 MSDN
  • @l33t 我同意 App 和 Window 是放置资源的最佳托管位置,除非它用于 ControlTemplate 或更具体的类似的东西。然而;有关于性能的讨论,无论应用程序级别还是窗口级别是最佳选择,它们都是最后一个搜索资源的选项。在大多数情况下,这不是问题,但有时资源查找可能是一个轻微的瓶颈,具体取决于您如何布局视图。 ://
  • 如果资源在视图级别,它将在视图加载时加载。这本身就很容易扼杀性能。特别是如果资源字典很大。我想你必须权衡这个成本和资源查找的成本。
猜你喜欢
  • 1970-01-01
  • 2011-03-10
  • 2013-12-09
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多