使用 MessageBox.Show() 阻止所有窗口

本文关键字:窗口 MessageBox Show 使用 | 更新日期: 2023-09-27 18:36:15

我目前正在开发一个具有多个窗口的WPF应用程序。在"主"窗口中,您应该能够关闭整个应用程序。在关闭应用程序之前,客户端希望它显示一个对话框,该对话框基本上询问"您确定要关闭应用程序吗"并阻止每隔一个窗口,直到用户回答。

我目前正在使用 MessageBox.Show() 来创建此对话框,但由于某种原因它只阻止了主窗口。

下面是我所说的最简单的示例;如果您创建一个包含两个按钮的 WPF 窗口:

private void openChildWindowButton_Click(object sender, RoutedEventArgs e)
{
  var window = new ChildWindow();
  window.Show();
}
private void openDialogButton_Click(object sender, RoutedEventArgs e)
{
  MessageBox.Show(this, "This should freeze all other windows");
} 

打开对话框将完全冻结第一个窗口。如果您单击它或尝试任何类型的交互,操作系统会发出"叮!"的声音,并在消息框上闪烁边框。但是您打开的所有其他窗口都可以单击,移动,调整大小等,这就是我想要防止的。

使用 MessageBox.Show() 阻止所有窗口

事实证明,有一种方法可以做到这一点,但它并不漂亮。它涉及使用 WinForms 版本的MessageBox并将未记录的选项作为最后一个属性传递。

var result = System.Windows.Forms.MessageBox.Show("Are you sure you want to exit this app?", "Exit", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question, System.Windows.Forms.MessageBoxDefaultButton.Button2, (System.Windows.Forms.MessageBoxOptions)8192 /*MB_TASKMODAL*/);

来源: http://social.msdn.microsoft.com/Forums/vstudio/en-US/8d1bd4a2-455e-4e3f-8c88-7ed49aeabc09/messagebox-is-not-applicationmodal?forum=wpf

希望这对将来的其他人有所帮助!

如果这在 WPF 中像在 Windows 窗体中一样有效,则可以使用:

MessageBox.ShowDialog()

克里斯

以上不起作用...

编辑:

但是有一个解决方法:像 MessageBox 一样设置窗体样式(使用固定的边框类型),然后使用 ShowDialog() 显示它。然后将"属性"中的"表单Cacel"和"确定"按钮设置为"按钮",您可以像在消息框中一样获得对话框结果。希望有帮助,但它也来自Windows窗体;)