我正在使用这个奇妙的框架在 WPF 中进行模式对话框。
使用这个框架,当用户从第一个对话框中单击一个按钮时,我试图让一个模态对话框覆盖另一个模态对话框。DemoApp
在for this framework 中有一个这样的例子,它只是使用_dialogmanager
先弹出一个 MessageDialog
然后再弹出另一个。
执行此操作的代码DemoApp
如下所示:
private void ShowLayeredDialog()
{
_dialogManager
.CreateMessageDialog("Wait 2 secs...", "I'm the 1st dialog", DialogMode.Ok)
.Show();
ThreadPool.QueueUserWorkItem(o =>
{
Thread.Sleep(2000);
_dialogManager
.CreateMessageDialog("Hello again...", "I'm the 2nd dialog", DialogMode.Ok)
.Show();
});
}
我尝试做类似的事情,但不是使用对 CreateMessageDialog 的方法调用,而是使用 their CreateCustomContentDialog()
,它接受一个对象并在模式视图中显示其内容(提供它的 a UIElement
)。
因此,已经调用_dialogManager
让我进入第一个模态视图,我在该视图上创建了一个按钮,该按钮将使用类似于他们的 DemoApp 代码的技术生成一个新的 CustomContentDialog :
ThreadPool.QueueUserWorkItem(o => _dialogManager.CreateCustomContentDialog(new SpikePhaseView(), DialogMode.Ok).Show());
不幸的是,我得到了异常'调用线程必须是 STA,因为许多 UI 组件在构造函数上需要这个' SpikePhaseView()
,这是一个普通的 UserControl。
因此,在此处和此处研究了此错误后,我从设置 ApartmentState(ApartmentState.STA) 的第二个链接中实施了未接受但高度赞成的解决方案,如下所示:
var test = new Thread(() => _dialogManager.CreateCustomContentDialog(new SpikePhaseView(), DialogMode.Ok).Show());
test.SetApartmentState(ApartmentState.STA);
test.Start();
但是后来在 WpfDialogManagment 框架代码的某个地方,我收到了这个错误'调用线程无法访问这个对象,因为另一个线程拥有它。' 在这段代码中:
public void SetCustomContent(object content)
{
CustomContent.Content = content;
}
上面,CustomContent(A System.Windows.Controls.ContentControl)被设置为我的 SpikePhaseView 对象。
编辑
在 DemoApp 中,他们能够成功启动两个模式对话框(没有错误)。为什么我不能让一个 UserControl(视图)生成另一个,而不会在哪个线程设置此 CustomContext 对象的内容时发生冲突?
似乎设置 ApartmentState 帮助我克服了第一个错误,但如果这一切都归结为使用 Dispatcher,有人可以提供一个示例,说明我如何在我的情况下使用它来启动调用以启动第二个模式视图?
谢谢