2010-07-20 119 views
0

XAML资源在什么意义上是静态的?关于XAML静态资源的“静态”究竟是什么?

By XAML资源我的意思是在资源块中声明的东西,并使用{StaticResource 资源名称}语法进行访问。

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

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

哪种行为会显现?


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

回答

1

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

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

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

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

+0

是的,我知道比运行时XAML有效解释。我试图发现的是,如果我创建一个页面类的多个实例,我会得到它的资源的多个实例。命名意味着生成的后台类像静态成员那样处理资源,这意味着页面的多个实例将共享一组通用资源。 – 2010-07-20 03:02:54

+0

StaticResource应该是一个单独的共享实例。看到这里:http://msdn.microsoft.com/en-us/library/bb613559.aspx – 2010-07-20 03:25:13

+0

该参考正是我寻求的答案。但是,如果您再次阅读它,则表示它不是单个共享实例。静态静态。我想他们真的意思是“声明式表达”,但感觉有点长。 – 2010-07-20 03:32:44

1

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

下面是一个例子:

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

在该示例应用程序,我们有在应用程序的ResourceDictionary限定的两个电刷,在CustomerWindow两个电刷和另外两个在CustomerListControlCustomerWindow有两个实例CustomerListControl,并且有三个窗口打开。

总共以下资源将被实例化:

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

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

MSDN article关于优化WPF性能非常值得一读。

+0

谢谢伊戈尔。不幸的是大卫先到那里。 – 2010-07-20 03:36:02