在使用 MVVM Light 消息创建新对话窗口时获取“调用线程必须是 STA”

本文关键字:调用 获取 线程 STA 窗口 Light MVVM 消息 创建 对话 新对话 | 更新日期: 2023-09-27 17:56:53

我有一个对话框窗口,当在我的视图视图中收到消息时会显示该窗口

对话框 http://pastebin.com/BAeCLwhz(我知道我应该有一个空的代码隐藏,但将其为空是第二优先级,所以现在这不是问题!

我在项目视图模型中创建窗口

MessengerInstance.Register<bool>(this, "Homing", ShowHomingDialog);
private void ShowHomingDialog(bool b)
    {
        HomingRobot hb = new HomingRobot();
        hb.ShowDialog();
    }

但是当它运行时,我得到"调用线程必须是 STA",我尝试在项目代码隐藏而不是在视图模型中调用对话框,但这给了我相同的结果。那么,我应该如何在不"多线程"的情况下弹出我的窗口,这在使用消息时甚至可能吗?

在使用 MVVM Light 消息创建新对话窗口时获取“调用线程必须是 STA”

您可以将 ShowDialog 代码包装在 Dispatcher.Invoke 中,如下所示

Dispatcher.CurrentDispatcher.Invoke((Action)(() =>
{
    HomingRobot hb = new HomingRobot();        
    hb.ShowDialog();
}));

如果上面的代码不起作用,您可以尝试以下操作

Application.Current.Dispatcher.Invoke((Action)(() =>
{
    HomingRobot hb = new HomingRobot();        
    hb.ShowDialog();
}));

您需要将 UI 工作"分派"到 UI 线程。

请参阅此提示 http://www.silverlightshow.net/items/Tip-Asynchronous-Silverlight-Execute-on-the-UI-thread.aspx