WPF - Вынудите ShowDialog возвратиться

Как я могу вызвать 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) находится все еще на стеке. Так или иначе это вынуждает главное окно не исчезнуть.

6
задан Dave Clemmer 14 September 2011 в 17:24
поделиться

3 ответа

Когда диалоговое окно принимает сообщение WM_CLOSE, он устанавливает флаг, который вызывает возврат ShowDialog после того, как WM_CLOSE и любые содержащие сообщения были полностью обработаны. Так что, если вы делаете Dispatcher .invoke () на вашу нить, чтобы позвонить MainWindow.close () , ShowDialog () не будет возвращаться до Диспетчер .invoke () завершен.

Таким образом, простое решение - вернуться из Dispatcher.invoke () , чтобы получить ShowDialog () для возврата. Если требуется дополнительная обработка, выполните другую Dispatcher.invoke () сразу после этого.

Если вы выполняете переход потока какой-либо другой путь, чем Dispatcher.invoke () , или если ShowDialog () не возвращается после вызова Dispatcher.invoke () Возвращает, вам, возможно, придется опубликовать некоторый код, окружающий ваш Window.Close () Вызов, чтобы мы могли видеть, что вы на самом деле делаете.

3
ответ дан 17 December 2019 в 07:05
поделиться
[

] Вы не можете заставить ShowDialog вернуться, но вы можете заставить окно прослушивать событие, отправленное вашим фреймворком, которое может сказать ему закрыться. В примере ниже событие Progress имеет флаг "Готово", который закрывает окно по завершению.[

] [
SomeGenerator IG = Manager.SomeGenerator();
SomeWindow PP = new SomeWindow();
IG.ProgressEvent += PP.ProgressEvent;
IG.ExecuteAsync();            
PP.ShowDialog();
]
1
ответ дан 17 December 2019 в 07:05
поделиться

Я понимаю, что я не могу заставить ShowDialog вернуться и продолжать выполнение всякий раз, когда я хочу. Обработчик событий для запроса, который я получаю из рамок, нуждается в выходе из контекста, поэтому стек вызовов можно размотать, а модальный диалог может обрабатывать тесное сообщение.

Я закончил установить логический флаг, запрашивая модали, чтобы закрыть, а затем вернуться с моего обработчика событий Framework. Только в этот момент будет отображаться returnog, и я могу проверить флаг, который я устанавливаю и продолжаю с запрошенным действием.

0
ответ дан 17 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: