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

如何让子窗口打开,并让父窗口等待子窗口关闭,然后父窗口继续执行?

有帮助吗?

解决方案

您是否尝试使用显示窗口 显示对话框 方法?

不要忘记设置 业主财产 从对话框窗口到主窗口。这将避免 Alt+Tabbing 等操作时出现奇怪的行为。

其他提示

很多这些答案都是简单的,如果有人开始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;
}

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

Window.ShowDialog将阻塞调用线程(有点[1]),并显示该对话框。它也将阻止父/所属窗口的互动。如果对话框被驳回(forwhatever原因)的ShowDialog将返回给调用者,并允许您访问的DialogResult(如果你想的话)。

[1]将通过推动一个调度帧到WPF dipatcher保持调度器泵送。这将导致消息泵,以保持泵送。

给定一个窗口对象mywindow的,myWindow.Show()将无模式打开和myWindow.ShowDialog()将模态打开。然而,即使后者不会阻塞,从记得什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top