如何在WPF中进行模态对话?

时间:2009-01-31 18:26:58

标签: .net wpf dialog modal-dialog

我正在WPF中编写我的第一个应用程序,并希望用户在模式对话框窗口中输入一些数据。显然,这在WPF中并不简单,因为父窗口保持完全启用,并且创建新子窗口的方法不会停止并等待子窗口调用Close()。相反,它只是继续前进。这不是我想要的。

如何让子窗口打开,让父窗口在父窗口继续执行之前等待子窗口关闭?

4 个答案:

答案 0 :(得分:199)

您是否尝试使用ShowDialog方法显示窗口?

不要忘记将对话框窗口中的Owner property设置为主窗口。当Alt + Tabbing等

时,这将避免奇怪的行为

答案 1 :(得分:27)

Window.Show窗口将显示窗口,并继续执行 - 这是一个非阻塞调用。

Window.ShowDialog将阻塞调用线程(kinda [1]),并显示对话框。它还将阻止与父/拥有窗口的交互。当对话框被解除时(无论什么原因),ShowDialog将返回给调用者,并允许您访问DialogResult(如果需要)。

[1]它会通过将调度程序帧推送到WPF dipatcher来保持调度员的抽水。这将导致消息泵继续泵送。

答案 2 :(得分:25)

很多这些答案都过于简单,如果有人开始使用WPF,他们可能不会知道所有的"进出",因为它比告诉某人更为复杂&#34 ;使用.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例程,选择&#34;转到定义&#34;。它将在MainWindow.xaml.cs中为您创建:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
}

在该函数中,您必须使用其页面类指定其他页面。假设您将其他页面命名为&#34; ModalWindow&#34;,以便它成为其页面类,并且是您实例化(调用)它的方式:

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

答案 3 :(得分:2)

给定一个Window对象myWindow,myWindow.Show()将无模式打开它,myWindow.ShowDialog()将以模态方式打开它。然而,即便是后者也不会阻止我记忆中的事情。