Как я могу вызвать ShowDialog
возвратиться из фонового потока?
Мне создали приложение WPF сверху C++ / платформа CLR, которая слушает сообщения, отправленные платформой. Одно конкретное сообщение так важно, что я должен закрыть все текущие окна. Однако, если модальное Dialog
(созданный ShowDialog
из моего главного окна), активный и ждущий ввод данных пользователем, окно не закроется, потому что это ожидает ShowDialog
возвратиться. Как я могу вызвать модальное Dialog
закрыть и раскрутить выполнение кода?
Я пытался установить DialogResult
или вызов Close
однако это, кажется, не работает.
Править: Dialog
создается моим главным окном, которое ожидает возвращаемое значение, как так: (в обработчике события Click в MainWindow
):
Window modalDialog = new Window();
bool ret = (bool)modalDialog.ShowDialog();
if (ret == true)
{
// do stuff
}
else
{
// do some other stuff
}
Когда платформа отправляет сообщение (входящий на другом потоке, чем поток UI), я звоню MainWindow.Close()
. Модальное диалоговое окно закрывается в этой точке, однако код, проверяющий возвращаемое значение Dialog
(после того, как ShowDialog
) находится все еще на стеке. Так или иначе это вынуждает главное окно не исчезнуть.
Когда диалоговое окно принимает сообщение WM_CLOSE, он устанавливает флаг, который вызывает возврат ShowDialog после того, как WM_CLOSE и любые содержащие сообщения были полностью обработаны. Так что, если вы делаете Dispatcher .invoke ()
на вашу нить, чтобы позвонить MainWindow.close ()
, ShowDialog ()
не будет возвращаться до Диспетчер .invoke ()
завершен.
Таким образом, простое решение - вернуться из Dispatcher.invoke ()
, чтобы получить ShowDialog ()
для возврата. Если требуется дополнительная обработка, выполните другую Dispatcher.invoke ()
сразу после этого.
Если вы выполняете переход потока какой-либо другой путь, чем Dispatcher.invoke ()
, или если ShowDialog ()
не возвращается после вызова Dispatcher.invoke () Возвращает, вам, возможно, придется опубликовать некоторый код, окружающий ваш Window.Close ()
Вызов, чтобы мы могли видеть, что вы на самом деле делаете.
] Вы не можете заставить ShowDialog вернуться, но вы можете заставить окно прослушивать событие, отправленное вашим фреймворком, которое может сказать ему закрыться. В примере ниже событие Progress имеет флаг "Готово", который закрывает окно по завершению.[
] [SomeGenerator IG = Manager.SomeGenerator();
SomeWindow PP = new SomeWindow();
IG.ProgressEvent += PP.ProgressEvent;
IG.ExecuteAsync();
PP.ShowDialog();
] Я понимаю, что я не могу заставить ShowDialog вернуться и продолжать выполнение всякий раз, когда я хочу. Обработчик событий для запроса, который я получаю из рамок, нуждается в выходе из контекста, поэтому стек вызовов можно размотать, а модальный диалог может обрабатывать тесное сообщение.
Я закончил установить логический флаг, запрашивая модали, чтобы закрыть, а затем вернуться с моего обработчика событий Framework. Только в этот момент будет отображаться returnog, и я могу проверить флаг, который я устанавливаю и продолжаю с запрошенным действием.