如何使WPF中的模式对话框?
我在WPF中编写我的第一个应用程序,并希望用户在模态对话窗口上input一些数据。 显然,这在WPF中并不简单,因为父窗口保持完全启用状态,并且创build新子窗口的方法不会停止并等待子窗口调用Close()。 相反,它只是继续前进。 这不是我想要的。
我怎样才能让子窗口打开,并有父窗口等待子窗口closures之前父窗口继续执行?
你有没有尝试使用ShowDialog方法显示你的窗口?
不要忘记将对话窗口上的Owner属性设置为主窗口。 这将避免当Alt + Tabbing等时出现奇怪的行为
Window.Show窗口将显示窗口,并继续执行 – 这是一个非阻塞的调用。
Window.ShowDialog将阻塞调用线程(kinda [1]),并显示对话框。 它也将阻止与父母/拥有窗口的交互。 当对话框被解散(无论什么原因)时,ShowDialog将返回给调用者,并允许你访问DialogResult(如果你需要的话)。
[1]通过将调度员框架推到WPF dipatcher上,它将保持调度员抽水。 这将导致消息泵继续泵送。
很多这些答案都是简单的,如果有人开始使用WPF,他们可能不知道所有的“input和输出”,因为它比告诉某人“使用.ShowDialog()
!”要复杂得多。 但是,这是你想要使用的方法(不是.Show()
),以阻止使用底层窗口,并保持代码继续,直到模式窗口closures。
首先,你需要2个WPF窗口。 (一个会打电话给另一个)
从第一个窗口开始,我们说MainWindow.xaml,它的代码将会是:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } }
然后将您的button添加到您的XAML:
<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />
然后右键单击Click
例程,select“转到定义”。 它会在MainWindow.xaml.cs中为你创build它:
private void btnOpenModal_Click(object sender, RoutedEventArgs e) { }
在这个函数中,你必须使用它的页面类来指定另一个页面。 假设你命名了其他页面“ModalWindow”,这样就成为它的页面类,并且你将如何实例化(调用)它:
private void btnOpenModal_Click(object sender, RoutedEventArgs e) { ModalWindow modalWindow = new ModalWindow(); modalWindow.ShowDialog(); }
假设你需要在modal dialog中设置一个值。 在ModalWindow
XAML中创build一个文本框和一个button:
<StackPanel Orientation="Horizontal"> <TextBox Name="txtSomeBox" /> <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> </StackPanel>
然后再次创build一个事件处理程序(另一个Click
事件),并使用它将该文本框的值保存到ModalWindow
上的公共静态variables并调用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对象myWindow,myWindow.Show()将以无模式打开它,myWindow.ShowDialog()将以模态方式打开它。 但是,即使后者不会阻止,从我记忆中。