如何在 WPF 中制作模式对话框?

如果我有一个 Xaml 窗口,那么如何将一个 打开它作为子窗口,然后让父窗口等待子窗口关闭,然后父窗口继续执行?

193838 次浏览

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

不要忘记将对话框窗口上的 业主财产设置为主窗口。这将避免在 Alt + 标签等时的奇怪行为。

给定一个 Window 对象。Show ()将非模态地打开它,而 myWindow。ShowDialog ()将以模态方式打开它。然而,据我所知,即使是后者也无法阻挡。

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

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

[1] 它将通过将一个调度器帧推送到 WPF 调度器来保持调度器运行。这将导致消息泵继续泵。

许多这些答案都过于简单化,如果有人正在开始 WPF,他们可能不知道所有的“内部和外部”,因为这是更复杂的比只是告诉别人“使用 .ShowDialog()!”.但是,您希望使用这种方法(而不是 .Show())来阻止对底层窗口的使用,并阻止代码继续执行,直到模态窗口关闭。

首先,您需要两个 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;
}