wpf - 如何将 wpf MessageBox.Owner 设置为桌面窗口,因为 SplashScreen 关闭 MessageBox

标签 wpf messagebox

我通过将位图的构建操作设置为Splashscreen来使用WPF中的SplashScreen功能。在启动屏幕后面,正在检查许可信息,如果失败,我会显示一个 MessageBox

根据这个Feedback ,这是因为 MessageBox.Owner 是启动屏幕,一旦另一个窗口打开,即使它是 MessageBox,启动屏幕窗口也会关闭,进而关闭 MessageBox,因此用户永远不会看到 MessageBox。

因此,解决方法是将 MessageBox.Owner 设置为另一个窗口,但这意味着我必须实例化另一个可能不需要的窗口。

是否可以将 MessageBox.Owner 设置为桌面窗口?以及如何实现,因为唯一想到的其他函数是 GetDesktopWindow() api 函数,但它返回一个窗口句柄,而 MessageBox.Owner 是一个 WPF 窗口。

最佳答案

由于使用桌面窗口作为模式对话框的父窗口并不是一个好主意,正如 @Nir 在他的回答中指出的那样,这里还有其他三种解决方法:

1) 使用隐藏窗口。创建一个微小的非模式窗口作为 MessageBox 或其他模式对话框的父窗口。这种方法的描述如下:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/116bcd83-93bf-42f3-9bfe-da9e7de37546/

2) 创建非模式消息窗口。将启动模式更改为显式关闭并使用非模式窗口来显示消息。此 StackOverflow 问题的答案中描述了此方法:

MessageBox with exception details immediately disappears if use splash screen in WPF 4.0

3) 调用MessageBox两次。显然,该问题仅影响显示的第一个模式对话框。因此,如果您不介意第一次打开和关闭时的闪烁,您可以简单地调用模态对话框两次。

https://connect.microsoft.com/VisualStudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

就我个人而言,我不喜欢这些解决方法。唯一的其他选择是避免内置的 SplashScreen 功能并从头开始创建自己的 SplashScreen 功能。如果您想进一步调查该路线,请点击以下链接:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8dd49fd0-9cc9-43c6-b285-6f119ab8a32e/

最后,如果你和我一样对这个问题感到恼火,你可以在这里投票支持微软修复这个错误:

http://connect.microsoft.com/VisualStudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

关于wpf - 如何将 wpf MessageBox.Owner 设置为桌面窗口,因为 SplashScreen 关闭 MessageBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/576503/

相关文章:

wpf - 在 wpf 中,我如何使数据网格适合窗口高度

c# - WPF 线程 C#

c# - .Net 3.5 的 WPF 日期选择器控件

c# - 如何在消息框中写入字典的内容?

c# - 如何在 C# 中更改 MessageBox 的大小?

c# - 我如何从 App.xaml.cs 运行 MessageBox.Show()

c# - InkCanvas 上的 MouseLeftButtonDown 事件

wpf - 使用 CommandParameters 和 MultiBindings?

c# - 在 C# 中将 DataTable 记录绑定(bind)或拉取到 MessageBox 文本

.net - 如何更改 MessageBox.Icon