цикл сообщений для запуска диалогового окна. Только цикл сообщений заблокирован, а не поток пользовательского интерфейса. Все циклы сообщений выполняются в одном потоке пользовательского интерфейса - это конструкция, управляемая самой платформой .NET.

тельно, но можно показать более одного диалогового окна одновременно, поместив вызов ShowDialog () в Dispatcher:

uiDispatcher.BeginInvoke(new Func<bool?>(myWindow.ShowDialog));

Почему это работает, и все же пользовательский интерфейс продолжает работать, реагируя на взаимодействие с пользователем, как только отображается диалоговое окно (я бы не подумал, поскольку ShowDialog () блокирует поток, в котором он находится, который должен быть потоком пользовательского интерфейса), можно даже продолжать показывать новые диалоги:

Window myWindow;
for(int i = 0; i < 5; i ++)
{
  myWindow = new Window(); 
  uiDispatcher.BeginInvoke(new Func<bool?>(myWindow.ShowDialog));
}

И пользовательский интерфейс все еще отзывчив.

Есть ли что-то, что я должен остерегаться полагаться на это поведение? (Я хочу показывать одно диалоговое окно поверх другого, когда этого хочет какой-то фоновый поток - это работает - единственное нежелательное поведение, по-видимому, при переключении приложений, иногда WPF не знает, какой диалог должен быть сверху - но все же позволяет перенести один из них. из диалогов впереди, нажав на него, что является необычным для диалога, так как нажатие вне диалога обычно не допускается).

ОБНОВИТЬ: Одна проблема, с которой я столкнулся, заключается в том, что если вы скроете один из ваших диалогов, пользователь снова сможет взаимодействовать со всеми остальными Windows! (не только другие диалоги). Видеть:WPF Dialog не модальный?

Ответы на вопрос(1)

Ваш ответ на вопрос