2012-05-10 35 views
0

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

感谢您的帮助。

回答

0

实际上,这只是.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 

它会与静态资源以同样的方式:你到了对象的引用,所以如果你空出你的参考,别人也没有提到它:他们只是另一个参考。

+0

感谢您answer.i现在看到的是这样的非标准behavior.so,当我写这样一个代码: this.Resources [“yellowBrush”] = NULL; 如果此资源是静态的,则更改不会反映,因为它被设置为例如按钮的背景,并且我的画笔对象仍然存在。但是如果这个资源是动态的,那么它会反映变化,我的按钮的背景色变为空。现在我想知道与我的问题相反,它是如何反映动态变化的? – user1388106

+0

@user:实际上,动态资源也是如此。如果你想改变资源,你应该查找它所在的资源字典,然后更新该字典。 – Vlad

0

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

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