我试图弄清楚 wpf 如何在后台管理静态资源。例如,如果我在后面的代码中获得一个静态资源并将其设置为 null 或为其定义一个新对象,则不会反映更改。但是,如果我获得静态资源并更改它的属性,则会反映更改。wpf 如何理解我是否更改了属性或设置对象引用并以这种方式运行?
感谢您的帮助。
我试图弄清楚 wpf 如何在后台管理静态资源。例如,如果我在后面的代码中获得一个静态资源并将其设置为 null 或为其定义一个新对象,则不会反映更改。但是,如果我获得静态资源并更改它的属性,则会反映更改。wpf 如何理解我是否更改了属性或设置对象引用并以这种方式运行?
感谢您的帮助。
实际上,这只是对象在 .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
与静态资源相同的方式:您获得对对象的引用,因此如果您取消引用,其他人不会提及它:他们只是有另一个引用。
WPF 绑定的资源需要包含在ResourceDictionary
. 当您在代码隐藏中获得对资源的引用时,您将获得对已包含在某处字典中的资源的引用,然后对其进行更改。因此,您会看到这些变化。
如果您通过代码从头开始创建一个,那么除非您将它添加到现有字典或创建一个新字典并将其添加到MergedDictionaries
应用程序中,否则 WPF 不知道它存在。有关更多信息,请参阅此 SO 问题:Programmatically add to Window.Resources in WPF