【问题标题】:How Does Wpf manage static resources?Wpf 如何管理静态资源?
【发布时间】:2012-05-10 21:01:09
【问题描述】:

我想弄清楚 wpf 如何在后台管理静态资源。例如,如果我在后面的代码中获得一个静态资源并将其设置为 null 或为其定义一个新对象,则不会反映更改。但是,如果我获得静态资源并更改它的属性,则会反映更改。 wpf 如何理解我是否更改了属性或设置对象引用并以这种方式表现?

感谢您的帮助。

【问题讨论】:

    标签: wpf staticresource


    【解决方案1】:

    实际上,这只是对象在 .NET 中的标准行为方式。某处有物体。你得到一个对象的引用,如果你将本地引用设置为null,任何其他持有该引用的对象都不会注意到——毕竟,它们有自己的引用!

    但是如果你改变了引用“指向”的东西,你现在就改变了实际的数据,所以每个人都看到了!

    例子:

    class MyObject { public int i; }
    
    MyObject ref1 = new MyObject() { i = 100 };
    MyObject ref2 = ref1; // ref2 is just another reference to the object
    ref1 = null;
    Console.WriteLine(ref2.i); // prints 100, the object is still alive
    ref1 = ref2;
    ref1.i = 50;
    Console.WriteLine(ref2.i); // prints 50, the object is changed
    

    与静态资源相同:您获得对对象的引用,因此如果您取消引用,其他人不会提及它:他们只是有另一个引用。

    【讨论】:

    • 感谢您的回答。我现在看到这是标准行为。所以,当我编写如下代码时:this.Resources["yellowBrush"] = null;如果此资源是静态的,则更改不会反映出来,因为它被设置为例如按钮的背景,而我的画笔对象仍然存在。但是如果这个资源是动态的,那么它会反映变化并且我的按钮的背景颜色变为空。现在我想知道我的问题的反面,当它是动态的时它如何反映变化?
    • @user:实际上,动态资源也是如此。如果要更改资源,则应查找其所在的资源字典,并更新该字典。
    【解决方案2】:

    WPF 绑定的资源需要包含在ResourceDictionary 中。当您在代码隐藏中获得对资源的引用时,您将获得对已包含在某处字典中的资源的引用,然后对其进行更改。因此,您会看到这些变化。

    如果您通过代码从头开始创建一个,那么除非您将其添加到现有字典或创建一个新字典并将其添加到应用程序的MergedDictionaries,否则 WPF 不知道它存在。有关更多信息,请参阅此 SO 问题:Programmatically add to Window.Resources in WPF

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 2022-12-04
      • 1970-01-01
      • 2010-10-25
      • 2013-10-23
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多