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

Ale*_*sky 125 .net wpf dialog modal-dialog

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

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

Yor*_*lov 208

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

不要忘记将对话框窗口中的Owner属性设置为主窗口.当Alt + Tabbing等时,这将避免奇怪的行为.

  • 不要忘记在对话框窗口中设置Owner属性.否则,当Alt + Tabbing等用户会出现奇怪的行为. (87认同)
  • 我正在学习,呵呵......非常好,谢谢 (2认同)

vap*_*guy 34

很多这些答案都很简单,如果有人开始使用WPF,他们可能不会知道所有的"输入和输出",因为它比告诉别人"使用.ShowDialog()!" 更复杂.但是,这是.Show()您要使用的方法(不),以阻止使用底层窗口并保持代码继续,直到模式窗口关闭.

首先,您需要2个WPF窗口.(一个人会打电话给另一个人.)

从第一个窗口开始,假设它被称为MainWindow.xaml,其代码隐藏将是:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将您的按钮添加到XAML:

<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />
Run Code Online (Sandbox Code Playgroud)

右键单击Click例程,选择"转到定义".它将在MainWindow.xaml.cs中为您创建它:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)

在该函数中,您必须使用其页面类指定其他页面.假设您将其他页面命名为"ModalWindow",那么它就成为了它的页面类,并且您将如何实例化(调用)它:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

假设您在模态对话框中设置了一个值.在ModalWindowXAML中创建一个文本框和一个按钮:

<StackPanel Orientation="Horizontal">
    <TextBox Name="txtSomeBox" />
    <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> 
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

然后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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的.ShowDialog()声明之后,您可以获取该值并使用它:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();

    string valueFromModalTextBox = ModalWindow.myValue;
}
Run Code Online (Sandbox Code Playgroud)

  • 那行不通。您的ModalPage应该扩展“ Window”而不是“ Page”。 (2认同)
  • 我的代码正确无误。你是对的。我更新了答案。我基本上是想提供项目实际代码的清理版本,所以我知道这种“框架”是可行的,但是是的,我应该有“ Window”而不是“ Page”。那天早上可能没喝咖啡。 (2认同)

Dom*_*ton 28

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

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

[1]它将通过将调度员框架推到WPF dipatcher上来保持调度员的抽水.这将导致消息泵继续泵送.