3

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

所以我有了将边距定义为静态资源的想法:

<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>

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

但在我做出这个相当耗时的更改之前,我想请您就这将如何影响性能提出专家意见。

不知何故,在我看来,我决定在任何地方使用静态资源 - 写作<TextBlock Margin="{StaticResource=MarginLeftHeader}" ... />而不是<TextBlock Margin="2,4,2,2" ... />- 至少需要为每个使用它的地方调用某个函数。这对吗?

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

4

2 回答 2

1

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

于 2012-05-31T08:47:48.263 回答
1

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

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

几个因素:

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

总而言之,因为您正在处理一个Thickness只有四个double值的简单结构,所以内存和性能差异可能相当可忽略不计,所以随您选择!

于 2012-05-31T08:55:02.167 回答