150

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

4

4 回答 4

243

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

不要忘记将对话窗口上的Owner 属性设置为主窗口。这将避免在 Alt+Tabbing 等时出现奇怪的行为。

于 2009-01-31T18:32:53.893 回答
66

很多这些答案都很简单,如果有人开始 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;
}
于 2017-03-21T17:01:30.647 回答
31

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

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

[1]它将通过将调度程序框架推送到 WPF 调度程序上来保持调度程序的运行。这将导致消息泵继续泵送。

于 2009-01-31T19:34:12.457 回答
2

给定一个 Window 对象 myWindow,myWindow.Show() 将无模式打开它,而 myWindow.ShowDialog() 将以模态方式打开它。但是,据我记得,即使是后者也不会阻止。

于 2009-01-31T18:34:02.953 回答