Как сделать модальный диалог в WPF? - PullRequest
117 голосов
/ 31 января 2009

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

Как я могу заставить дочернее окно открыться и заставить родительское окно ждать, пока дочернее окно закроется, прежде чем родительское окно продолжит выполняться?

Ответы [ 4 ]

200 голосов
/ 31 января 2009

Вы пытались показать свое окно, используя метод ShowDialog ?

Не забудьте установить свойство Владелец в диалоговом окне в главное окно. Это позволит избежать странного поведения, когда Alt + Tabbing и т. Д.

27 голосов
/ 31 января 2009

Window.Show Window покажет окно и продолжит выполнение - это неблокирующий вызов.

Window.ShowDialog заблокирует вызывающий поток (своего рода [1]) и покажет диалоговое окно. Это также заблокирует взаимодействие с родительским / владельцем окна. Когда диалоговое окно закрывается (по какой-либо причине), ShowDialog вернется к вызывающей стороне и позволит вам получить доступ к DialogResult (если вы этого хотите).

[1] Он будет поддерживать накачку диспетчера, надевая раму диспетчера на распределитель WPF. Это приведет к тому, что сообщение насос продолжит качать.

26 голосов
/ 21 марта 2017

Многие из этих ответов являются упрощенными, и если кто-то начинает 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();
}

Скажем, у вас есть значение, которое вам нужно установить в вашем модальном диалоге. Создайте текстовое поле и кнопку в ModalWindow XAML:

<StackPanel Orientation="Horizontal">
    <TextBox Name="txtSomeBox" />
    <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> 
</StackPanel>

Затем снова создайте обработчик события (еще одно событие Click) и используйте его для сохранения значения текстового поля в общедоступной статической переменной в 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;
}
2 голосов
/ 31 января 2009

Учитывая объект Window myWindow, myWindow.Show () откроет его без режима, а myWindow.ShowDialog () откроет его модально. Однако даже последний не блокирует, насколько я помню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...