我从不同的应用程序启动一个Window。每当我启动Window时,都是从不同的线程完成的。我第一次启动Window时,一切正常。以后的每次尝试都会失败并显示错误:The calling thread cannot access this object because a different thread owns it.
我曾经在Xaml中分配DataContext,如下所示:
<UserControl.DataContext>
<viewModels:MyViewModel/>
</UserControl.DataContext>
错误停止了,当我更改错误时,从后面的代码中分配ViewModel,如下所示:
public MyView() {
InitializeComponent();
DataContext = new MyViewModel();
}
根据answer at MSDN,这两种方法应该是等价的。
为什么我会得到不同的结果?有没有办法让我的第一个方法工作(我喜欢它)?
修改
控件在另一个Xaml中初始化:
<userControls:MyView Grid.Column="2" x:Name="MyView" Grid.ColumnSpan="1" ></userControls:MyView>
窗口本身使用
启动AutoResetEvent are = new AutoResetEvent(false);
Thread thread = new Thread(() => {
MyMainWindow form = new MyMainWindow(someObject);
form.Closed += (sender2, e2) => {
Dispatcher.CurrentDispatcher.InvokeShutdown();
are.Set();
};
form.Show();
Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
are.WaitOne();
编辑2:
经过一些调试后,我找到了根本原因。我正在使用基于Prism Event Aggregator的消息传递系统的自定义实现。当MyMainWindow关闭时,我没有清除所有订阅。