如何在WPF中制作模式对话框?
-
20-08-2019 - |
题
我正在用 WPF 编写第一个应用程序,并希望用户在模式对话框窗口上输入一些数据。显然,这在 WPF 中并不简单,因为父窗口保持完全启用状态,并且创建新子窗口的方法不会停止并等待子窗口调用 Close()。相反,它只是继续前进。这不是我想要的。
如何让子窗口打开,并让父窗口等待子窗口关闭,然后父窗口继续执行?
其他提示
很多这些答案都是简单的,如果有人开始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()将模态打开。然而,即使后者不会阻塞,从记得什么。