Получить «Вызывающий поток должен быть STA» при создании нового диалогового окна с использованием MVVM Light messages

#c# #.net #wpf #mvvm-light

#c# #.net #wpf #mvvm-light

Вопрос:

У меня есть диалоговое окно, которое отображается при получении сообщения в моем представлении View-Model

Диалог выглядит так, как здесь http://pastebin.com/BAeCLwhz (Я знаю, что у меня должен быть пустой codebehind, но сделать его пустым — второй приоритет, так что сейчас это не проблема!)

Я создаю окно в моей модели представления проектов с

 MessengerInstance.Register<bool>(this, "Homing", ShowHomingDialog);

private void ShowHomingDialog(bool b)
    {
        HomingRobot hb = new HomingRobot();
        hb.ShowDialog();
    }
  

Но при его запуске я получаю «Вызывающий поток должен быть STA», я попытался вызвать диалоговое окно в projects codebehind, а не в viewmodel, но это дало мне тот же результат. Итак, как я должен заставить мое окно всплывать, не будучи «многопоточным», возможно ли это вообще при использовании сообщений?

Ответ №1:

Вы можете обернуть код ShowDialog в диспетчер.Вызвать, как показано ниже

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

Если приведенный выше код не работает, вы можете попробовать следующее

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

Ответ №2:

Вам нужно «отправить» свою работу пользовательского интерфейса потоку пользовательского интерфейса.

Смотрите этот совет http://www.silverlightshow.net/items/Tip-Asynchronous-Silverlight-Execute-on-the-UI-thread.aspx

Комментарии:

1. Это создание моего диалога, которое я должен создать в диспетчере? И если да, должен ли я тогда просто начать вызывать, а затем он «находит» поток пользовательского интерфейса?

2. Вероятно, это hb.ShowDialog() то, что вам нужно отправить, и, да, оно находит поток. Погуглите в Dispatcher.