什么是关于XAML静态资源的“静态”?

时间:2010-07-20 02:42:39

标签: xaml resources

XAML资源在什么意义上是静态的?

通过XAML资源,我指的是在资源块中声明的事物,并使用{StaticResource resource-name }语法进行访问。

页面资源的行为就好像它们是页面类的静态成员一样吗?或者,如果我要创建页面类的多个实例,我会获得其资源的多个实例吗?

命名法意味着资源将像静态成员一样处理,这意味着页面的多个实例将共享一组共同的资源。

会表现出哪种行为?


请注意,实际答案在对已接受回复的评论中。重要的部分是this link

2 个答案:

答案 0 :(得分:1)

它与c#中的静态类型没有任何共同之处。

使用StaticResource将在第一次访问时评估资源,即不在编译时。

每次需要资源时都会评估DynamicResource。

另请注意,编译器根本不评估资源,动态或静态。

答案 1 :(得分:1)

为每个定义它的WPF实体创建资源字典的副本。编程语言中静态的定义在这里不适用。

以下是一个例子:

Application
 |-ResourceDictionary
   |-Brush1
   |-Brush2
 |-CustomerWindow          x3
   |-ResourceDictionary   
     |-Brush3
     |-Brush4
   |-CustomerListControl   x2
     |-ResourceDictionary 
       |-Brush5
       |-Brush6

在这个示例应用程序中,我们在应用程序resourcedictionary中定义了两个画笔,CustomerWindow中有两个画笔,CustomerListControl中有另外两个画笔。 CustomerWindow有两个CustomerListControl个实例,有三个窗口打开。

总共将实例化以下资源:

Brush1 - 1x(一个应用程序)
Brush2 - 1x
Brush3 - 3x(三个窗口打开)
Brush4 - 3x
Brush5 - 6x(三个窗口*每个窗口两个控件)
刷6 - 6x

如果您担心资源使用情况,则应在最顶层定义资源。因此,在这种情况下,如果在应用程序级别定义了所有画笔,则无论打开多少个窗口,每个画笔都只有一个实例。

关于优化WPF性能的

MSDN article非常值得一读。