在我的WPF
包括Caliburn.Micro
应用程序中,我想向用户显示一个新窗口。这适用于所有窗户,但一个。它引发了一个异常陈述
调用线程无法访问此对象,因为另一个线程拥有它。
这就是我调用Window Manager的方式
WindowManager.ShowWindow(new DatabaseCredentialsViewModel(EventAggregator, WindowManager,
SettingsManager));
此外,我还试图通过new WindowManager().ShowWindow(...);
“创建一个新的窗口管理器”。但是,上述工作都没有。有什么不同于其他窗户?
我在OnViewLoaded
的后台开始了一个新线程,我想从中展示一个新窗口。我首先开始一个新线程的原因是默认情况下,GUI线程是主线程,因此,如果我不启动新线程,则在执行代码之前GUI不会正确加载(等等。)
编辑I:我调查了问题并发现它不是窗口管理器导致此时出现问题,但可能是new DatabaseCredentialsViewModel
,因为我创建了一个全新的窗口管理器(原始的一个新实例)类),它仍然会抛出相同的错误。
编辑II:我试过这个。但是,确切的错误仍然存在。
Dispatcher.CurrentDispatcher.BeginInvoke((Action) (() =>
{
WindowManager.ShowWindow(new DatabaseCredentialsViewModel(EventAggregator, WindowManager, SettingsManager));
}));
答案 0 :(得分:0)
WPF应用程序是单线程应用程序,您无法直接从另一个线程修改GUI元素。您可以使用Dispatcher
进行此操作(Google Dispatcher.BeginInvoke
,或查看),或BackgroundWorker
,或者最好使用async/await
(请参阅example )。