wpf がバックグラウンドで静的リソースを管理する方法を理解しようとしています。たとえば、コード ビハインドで静的リソースを取得して null に設定したり、新しいオブジェクトを定義したりしても、変更は反映されません。しかし、静的リソースを取得してそのプロパティを変更すると、変更が反映されます。プロパティを変更したり、オブジェクト参照を設定したりして、このように動作した場合、wpf はどのように理解しますか?
助けてくれてありがとう。
wpf がバックグラウンドで静的リソースを管理する方法を理解しようとしています。たとえば、コード ビハインドで静的リソースを取得して null に設定したり、新しいオブジェクトを定義したりしても、変更は反映されません。しかし、静的リソースを取得してそのプロパティを変更すると、変更が反映されます。プロパティを変更したり、オブジェクト参照を設定したりして、このように動作した場合、wpf はどのように理解しますか?
助けてくれてありがとう。
WPF がバインドするリソースは、ResourceDictionary
. コード ビハインドでリソースへの参照を取得すると、どこかのディクショナリに既に含まれているリソースへの参照を取得し、それを変更します。したがって、それらの変更が表示されます。
コードを使用して最初から作成した場合、それを既存の辞書に追加するか、新しい辞書を作成しMergedDictionaries
てアプリケーションに追加しない限り、WPF はそれが存在することを認識しません。詳細については、この SO の質問を参照してください: Programmatically add to Window.Resources in 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
静的リソースの場合と同じです。オブジェクトへの参照を取得するため、参照を無効にすると、他の人はそれについて言及しません。別の参照があるだけです。