XAML资源在什么意义上是静态的?关于XAML静态资源的“静态”究竟是什么?
By XAML资源我的意思是在资源块中声明的东西,并使用{StaticResource 资源名称}语法进行访问。
页面资源的行为就好像它们是页面类上的静态成员一样吗?或者,我是否要创建一个页面类的多个实例,我是否会获得其资源的多个实例?
命名法意味着资源将像静态成员一样处理,这意味着页面的多个实例将共享一组通用资源。
哪种行为会显现?
请注意,实际答案在接受答复的评论中。重要的部分是this link。
XAML资源在什么意义上是静态的?关于XAML静态资源的“静态”究竟是什么?
By XAML资源我的意思是在资源块中声明的东西,并使用{StaticResource 资源名称}语法进行访问。
页面资源的行为就好像它们是页面类上的静态成员一样吗?或者,我是否要创建一个页面类的多个实例,我是否会获得其资源的多个实例?
命名法意味着资源将像静态成员一样处理,这意味着页面的多个实例将共享一组通用资源。
哪种行为会显现?
请注意,实际答案在接受答复的评论中。重要的部分是this link。
它与c#中的静态类型没有任何共同之处。
使用StaticResource将评估资源一次,即第一次进行访问,即不在编译时。
每次需要资源时都会评估DynamicResource。
另请注意,编译器根本不评估资源,动态或静态。
资源字典的副本是使用定义它的每个WPF实体创建的。来自编程语言的静态定义在这里并不适用。
下面是一个例子:
Application |-ResourceDictionary |-Brush1 |-Brush2 |-CustomerWindow x3 |-ResourceDictionary |-Brush3 |-Brush4 |-CustomerListControl x2 |-ResourceDictionary |-Brush5 |-Brush6
在该示例应用程序,我们有在应用程序的ResourceDictionary限定的两个电刷,在CustomerWindow
两个电刷和另外两个在CustomerListControl
。 CustomerWindow
有两个实例CustomerListControl
,并且有三个窗口打开。
总共以下资源将被实例化:
Brush1 - 1(一个应用程序)
Brush2 - 1
Brush3 - 3X(三个窗口是打开)
Brush4 - 3倍
Brush5 - 6X(三个窗口*每个窗口两个控件)
Brush6 - 6x
如果您关心资源使用情况,则应该在最上层定义资源。因此,在这种情况下,如果所有画笔都是在应用程序级别上定义的,则无论打开多少个窗口,都只会有一个实例。
MSDN article关于优化WPF性能非常值得一读。
谢谢伊戈尔。不幸的是大卫先到那里。 – 2010-07-20 03:36:02
是的,我知道比运行时XAML有效解释。我试图发现的是,如果我创建一个页面类的多个实例,我会得到它的资源的多个实例。命名意味着生成的后台类像静态成员那样处理资源,这意味着页面的多个实例将共享一组通用资源。 – 2010-07-20 03:02:54
StaticResource应该是一个单独的共享实例。看到这里:http://msdn.microsoft.com/en-us/library/bb613559.aspx – 2010-07-20 03:25:13
该参考正是我寻求的答案。但是,如果您再次阅读它,则表示它不是单个共享实例。静态静态。我想他们真的意思是“声明式表达”,但感觉有点长。 – 2010-07-20 03:32:44