WPF - 将MessageBox置顶

6
我有一个WPF应用程序,我需要MessageBox始终保持在最顶层。 在Win Forms中,我会这样做:
System.Windows.Forms.MessageBox.Show(new Form() { TopMost = true }, "sure you wanna save?", "confirm", MessageBoxButtons.YesNo)

但我该如何在WPF中做到这一点呢?

我看到了一些不同的答案,但它们都不适用于我,例如:

MessageBox.Show(Application.Current.MainWindow, "Im always on top - of the main window");

我的mainWindow为空。 在我的应用程序中,MessageBox从不同的页面打开,而不是窗口。

有没有最简单的方法来解决这个问题?


查看 ShowDialog() - DLeh
显示没有所有者的对话框是一个错误。这个错误的后果是你永远无法确定用户是否真正看到了对话框,它很容易隐藏在他正在使用的窗口后面。如果你没有窗口,那么你必须使用NotifyIcon代替。 - Hans Passant
3个回答

14

使用MessageBoxOptions.DefaultDesktopOnly,可以使MessageBox始终位于窗口的顶部。

MessageBox.Show("You entered an incorrect value. Try once more.", "Wrong input", MessageBoxButton.OK, MessageBoxImage.Exclamation,MessageBoxResult.OK,MessageBoxOptions.DefaultDesktopOnly);

6
  this.Dispatcher.Invoke((Action)(() =>
{
 MessageBox.Show("Im always on top - of the main window");
}));

这将在UI线程中运行。将其放入显示消息框的方法中。

祝好, G


你的回答没有意义,也不起作用,伙计——完全是个负一。 - DasDas
2
你不理解什么?你有一个展示消息框的方法,你需要做的是在UI线程中调用它。这将使该框置于最顶层。实际上非常简单明了。 - TGarrett
3
这种方法是有效的。你可能想尝试使用 Application.Current.Dispatcher.Invoke(...) 而不是 this.Dispatcher.Invoke。 - fsharp
如果父窗口具有TopMost设置,则该设置将无效。请使用https://dev59.com/pYrda4cB1Zd3GeqPQLkU#53009621。 - Dmitry

-1

您需要创建自己的Window并将其Topmost值设置为true。

MyWindow dialog = new MyWindow();
dialog.Topmost = true;
dialog.Show();

然后我怎么知道在页面上他按了"OK"还是"Cancel"? - DasDas
如果您想要获取结果,应该使用ShowDialog()而不是Show()。这将显示为模态窗口。在窗口中,您可以将DialogResult设置为布尔值,该值由ShowDialog()返回。 - Domysee
@George在https://dev59.com/pYrda4cB1Zd3GeqPQLkU#53009621提供的答案可以在没有自定义窗口的情况下正常工作。 - Dmitry

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