Как сделать модальный диалог в WPF?



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



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

927   4  

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();
}

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

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

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

    Ничего не найдено.