将边距定义为静态资源是否会产生显着的性能开销?

时间:2012-05-31 08:39:41

标签: wpf performance xaml staticresource

我有很多“乐趣”试图让我的XAML中的边距(和宽度)与同一应用程序中的其他边距以及相同“套件”应用程序中的其他应用程序中的边距一致。

所以我有了将边距定义为staticresources的想法:

<Thickness x:Key="MarginDetailTabPageContent">0</Thickness>
<Thickness x:Key="MarginLeftHeader">2,4,2,2</Thickness>
<Thickness x:Key="MarginAdditionalInfoOnTop">1,2,2,0</Thickness>
<Thickness x:Key="MarginSmallHeaderOnTop">1,2,2,0</Thickness>
<Thickness x:Key="MarginFieldWithAdditionalMarginOnTop">0,0,2,2</Thickness>
<System:Double x:Key="WidthSmallField">70</System:Double>

..然后我计划在我的应用程序中的几乎所有控件上随处使用这些静态资源..标签,文本块,文本框,复选框..

但在我做出这个相当耗时的改变之前,我希望你的专家意见如何影响表现。

在某种程度上,在我看来,我已经决定使用staticresource - 编写<TextBlock Margin="{StaticResource=MarginLeftHeader}" ... />而不是<TextBlock Margin="2,4,2,2" ... /> - 到处花费至少为每个使用它的地方调用某个函数。这是对的吗?

总体问题是:用户是否能够感受到性能的任何变化(更糟糕的是......或者更好)?

2 个答案:

答案 0 :(得分:1)

在加载实际运行应用程序之前发生的XAML期间,将解析StaticResource并将其分配给该属性。它只会被分配一次,并且忽略对资源字典的任何更改。所以性能没有显着差异;该资源的查找行为类似到编译时查找。

答案 1 :(得分:1)

在您的应用中设置多个<TextBlock Margin="2,4,2,2" ... />个实例会导致为每个实例创建一个新的独立Thickness对象。

拥有一个Thickness资源,以及<TextBlock Margin="{StaticResource MarginLeftHeader}" ... />的多个实例将只创建一个Thickness对象,并对其进行多次引用。

一些因素:

  • 第二个选项使用的内存少于第一个选项(即内存中少Thickness个对象。)
  • 如果要在全球范围内调整应用程序的边距,或者在不同情况下提供不同的边距,第二种选择会让生活变得更轻松。
  • 我不确定哪个选项会表现更好 - 实例化新Thickness个对象而不是查找资源。我的直觉是,对于一个简单的Thickness结构,第一个选项可能实际上表现更好(而对于更复杂的基于类的对象可能会有所不同)。

总而言之,因为您处理的是仅有四个Thickness值的简单double结构,内存和性能差异可能相当微不足道,所以您可以选择哪个!