Я пишу свое первое приложение в WPF и хочу, чтобы пользователь вводил некоторые данные в модальном диалоговом окне. По-видимому, сделать это в WPF непросто, потому что родительское окно остается полностью включенным, а метод, создавший новое дочернее окно, не останавливается и не ждет, пока дочернее окно вызовет Close (). Вместо этого он просто продолжает идти вперед. Это не то, что я хочу.
Как я могу открыть дочернее окно и заставить родительское окно ждать закрытия дочернего окна, прежде чем родительское окно продолжит выполнение?
.net
wpf
dialog
modal-dialog
Алекс Бараноский
источник
источник
Ответы:
Вы пытались показать свое окно с помощью метода ShowDialog ?
Не забудьте установить свойство Owner в диалоговом окне на главное окно. Это позволит избежать странного поведения при нажатии Alt + Tab и т. Д.
источник
Многие из этих ответов упрощены, и если кто-то начинает WPF, он может не знать всех «входов и выходов», поскольку это сложнее, чем просто сказать кому-то «Используйте
.ShowDialog()
!». Но это метод (а не.Show()
), который вы хотите использовать, чтобы заблокировать использование нижележащего окна и предотвратить продолжение выполнения кода до закрытия модального окна.Во-первых, вам нужно 2 окна WPF. (Один будет звонить другому.)
Предположим, из первого окна оно называлось MainWindow.xaml, в его коде программной части будет:
Затем добавьте свою кнопку в свой XAML:
И щелкните
Click
процедуру правой кнопкой мыши , выберите «Перейти к определению». Он создаст его для вас в MainWindow.xaml.cs:Внутри этой функции вы должны указать другую страницу, используя ее класс страницы. Допустим, вы назвали эту другую страницу «ModalWindow», так что она становится ее классом страницы, и именно так вы можете создать (вызвать) его:
Скажем, у вас есть значение, которое вам нужно установить в модальном диалоговом окне. Создайте текстовое поле и кнопку в
ModalWindow
XAML:Затем
Click
снова создайте обработчик события (другое событие) и используйте его, чтобы сохранить значение текстового поля в общедоступной статической переменнойModalWindow
и вызватьthis.Close()
.Затем, после вашего
.ShowDialog()
утверждения, вы можете взять это значение и использовать его:источник
Window.Show Window покажет окно и продолжит выполнение - это неблокирующий вызов.
Window.ShowDialog заблокирует вызывающий поток (kinda [1]) и покажет диалог. Он также заблокирует взаимодействие с родительским окном / окном-владельцем. Когда диалоговое окно закрыто (по какой-либо причине) ShowDialog вернется к вызывающему и позволит вам получить доступ к DialogResult (если вы этого хотите).
[1] Он будет поддерживать перекачку диспетчера, помещая кадр диспетчера в дипатчер WPF. Это заставит насос сообщений продолжать перекачивание.
источник
При наличии объекта Window myWindow myWindow.Show () откроет его немодально, а myWindow.ShowDialog () откроет его модально. Однако даже последний не блокирует, насколько я помню.
источник
ShowDialog
не возвращается, пока модальное окно не будет закрыто, поэтому оно блокирует выполняемую в данный момент операцию диспетчера. НоShowDialog
сам фактически вызываетDispatcher.Run()
, поэтому диспетчер продолжает выполнять операции, по сути, сохраняя отклик пользовательского интерфейса.