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

3
我目前正在开发一个有多个窗口的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");
} 

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

将主窗口作为Show()函数的父参数传递。 - 500 - Internal Server Error
那似乎没有影响。尽管如此,为了完整起见,我还是将其放入OP代码示例中。 - DallonF
1
我想这可能有点复杂,但为什么不自己制作一个带标签的小表单,隐藏最大化/最小化/关闭按钮,并使构造函数接受一个字符串。将标签的文本设置为该字符串,然后添加一些确定/取消按钮呢? - sab669
希望能避免创建一个模仿MessageBox的自定义窗口,但最终可能只能这样做。 - DallonF
2个回答

7
事实证明,确实有一种方法可以做到这一点,但不太美观。它涉及使用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 希望这对将来的某个人有所帮助!

0
如果在 WPF 中像在 Windows Forms 中一样工作,您可以直接使用以下代码:
MessageBox.ShowDialog()

chris

上面的代码不起作用...

编辑:

但是有一种变通方法:将一个表单样式设置成消息框的样式(使用固定的边框类型),然后使用ShowDialog()方法显示该表单。然后在属性中将表单的取消和确定按钮设置为您自己的按钮,就可以像在消息框中一样获取一个DialogResult了。希望这能有所帮助,但它也是来自于Windows-Forms ;)


3
无论是WPF还是WinForms中都没有MessageBox.ShowDialog()方法。 - DallonF
哦,抱歉,我以为它在那里;) 但是有一个解决方法:像MessageBox一样设计一个Form(使用固定的边框类型),然后使用ShowDialog()显示它。然后在属性中设置表单的取消和确定按钮为您的按钮,就可以像在MessageBox中一样获得DialogResult。希望这有所帮助,但它也来自Windows-Forms ;) - Chris
@ChristophervonBlum 那会导致和原帖提到的同样行为;MessageBoxShow 方法本来就是一个模态对话框。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接