【问题标题】:What exactly is "static" about a XAML static resource?XAML 静态资源的“静态”究竟是什么?
【发布时间】:2010-07-20 11:34:36
【问题描述】:

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

XAML 资源是指在资源块中声明并使用 {StaticResource resource-name} 语法访问的东西。

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

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

会表现出哪些行为?


请注意,实际答案在已接受响应的 cmets 中。重要的部分是this link

【问题讨论】:

    标签: xaml resources


    【解决方案1】:

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

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

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

    另请注意,编译器根本不评估资源,无论是动态的还是静态的。

    【讨论】:

    • 是的,我知道 XAML 在运行时被有效解释。我试图发现的是,如果我创建一个页面类的多个实例,我是否会获得其资源的多个实例。命名法意味着生成的支持类处理静态成员等资源,这意味着页面的多个实例将共享一组公共资源。
    • StaticResource 应该是单个共享实例。见这里:msdn.microsoft.com/en-us/library/bb613559.aspx
    • 参考正是我寻求的答案。但是,如果您再次阅读它,它会说它不是一个共享实例。静态不是静态的。我猜它们的真正意思是“声明式表达”,但感觉有点长。
    【解决方案2】:

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

    这是一个例子:

    应用 |-资源字典 |-画笔1 |-画笔2 |-客户窗口 x3 |-资源字典 |-Brush3 |-Brush4 |-客户列表控件 x2 |-资源字典 |-画笔5 |-画笔6

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

    总共将实例化以下资源:

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

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

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

    【讨论】:

    • 谢谢伊戈尔。不幸的是,大卫先到了那里。
    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    相关资源
    最近更新 更多