Как сделать модальный диалог в WPF?
Я пишу свое первое приложение в WPF и хочу, чтобы пользователь вводил некоторые данные в модальное диалоговое окно. По-видимому, это не просто сделать в WPF, потому что родительское окно остается полностью включенным, а метод, создавший новое дочернее окно, не останавливается и не ждет, пока дочернее окно вызовет Close(). Вместо этого он просто продолжает идти вперед. Это не то, чего я хочу.
Как я могу открыть дочернее окно и заставить родительское окно ждать, пока ребенок закроется прежде чем родительское окно продолжит выполнение?
4 ответов:
вы пытались показать свое окно с помощью ShowDialog способ?
Не забудьте установить собственнику имущества в диалоговом окне главного окна. Это позволит избежать странного поведения при Alt + табуляции и т. д.
многие из этих ответов упрощены, и если кто-то начинает WPF, они могут не знать всех "входов и выходов", так как это сложнее, чем просто сказать кому-то "использовать
.ShowDialog()!". Но это метод (не.Show()), который вы хотите использовать для того, чтобы заблокировать использование базового окна и сохранить код от продолжения до тех пор, пока модальное окно не будет закрыто.во-первых, вам нужно 2 окна WPF. (Один будет звонить другому.)
С первого окно, скажем так, называлось MainWindow.xaml, в его коде позади будет:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } }затем добавьте кнопку в свой XAML:
<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />и щелкните правой кнопкой мыши
Clickрутину, выберите "Перейти к определению". Он создаст его для вас в MainWindow.код XAML.cs:private void btnOpenModal_Click(object sender, RoutedEventArgs e) { }в этой функции, вы должны указать другую страницу, используя свой класс страницы. Скажем, вы назвали эту другую страницу "ModalWindow", так что это становится ее классом страницы и так, как вы бы создать экземпляр (вызов) его:
private void btnOpenModal_Click(object sender, RoutedEventArgs e) { ModalWindow modalWindow = new ModalWindow(); modalWindow.ShowDialog(); }скажем, у вас есть значение, которое вам нужно установить в модальном диалоговом окне. Создайте текстовое поле и кнопку в
ModalWindowXAML:<StackPanel Orientation="Horizontal"> <TextBox Name="txtSomeBox" /> <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> </StackPanel>затем создайте обработчик событий (другой
Clickevent) снова и используйте его для сохранения значения текстового поля в общедоступную статическую переменную наModalWindowи звонокthis.Close().public partial class ModalWindow : Window { public static string myValue = String.Empty; public ModalWindow() { InitializeComponent(); } private void btnSaveData_Click(object sender, RoutedEventArgs e) { myValue = txtSomeBox.Text; this.Close(); } }затем, после
.ShowDialog()заявление, вы можете взять это значение и использовать его:private void btnOpenModal_Click(object sender, RoutedEventArgs e) { ModalWindow modalWindow = new ModalWindow(); modalWindow.ShowDialog(); string valueFromModalTextBox = ModalWindow.myValue; }
данный объект window окно, окно.Show () откроет его без мод и myWindow.ShowDialog () откроет его модально. Однако даже последнее не блокирует, насколько я помню.
Comments