XAML资源在什么意义上是静态的?
通过XAML资源,我指的是在资源块中声明的事物,并使用{StaticResource resource-name }语法进行访问。
页面资源的行为就好像它们是页面类的静态成员一样吗?或者,如果我要创建页面类的多个实例,我会获得其资源的多个实例吗?
命名法意味着资源将像静态成员一样处理,这意味着页面的多个实例将共享一组共同的资源。
会表现出哪种行为?
请注意,实际答案在对已接受回复的评论中。重要的部分是this link。
答案 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非常值得一读。