#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.