我对此感到非常困惑,它开始让我质疑我对 WPF 资源系统的整体理解
我有一个多窗口应用程序,其中每个 Window 派生对象在具有单独调度程序的单独线程上运行。
Thread t = new Thread(() => {
Window1 win = new Window1();
win.Show();
System.Windows.Threading.Dispatcher.Run();
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
我有一个 Dictionary1.xaml 资源字典,其中包含一个命名的 Style 对象(它只是将 Background 属性设置为 Red 并针对 TextBox)。在我的 App.xaml 中,我通过 ResourceDictionary.MergedDictionaries 集合引用 Dictionary1.xaml。在我的其他窗口的 XAML 中,我有一个静态资源到文本框控件中的样式键,它可以工作。
我可以打开多个窗口,但不应该出现跨线程错误吗?在其中一个窗口类的构造函数中,我这样做了:
Style s = (Style)TryFindResource("TestKey");
Console.WriteLine(((Setter)s.Setters[0]).Property.Name); // no problem
s.Dispatcher == this.Dispatcher // false
由于 Style 对象是从 DispatcherObject 派生的,这是否意味着它只能由拥有它的线程访问?如果在 ResourceDictionary 中定义了一个对象,这是否意味着默认情况下它是一个静态实例?这怎么可能工作?为什么我没有收到跨线程错误?
(我错误地报告了一个我后来删除的关于由其他原因引起的跨线程错误的问题)
我对此感到非常困惑 - 我认为只有冻结的 Freezable 对象可以跨线程共享。为什么允许我访问其他线程上的 DispatcherObject?