当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《如何将WpfMessageBox.Owner设置为桌面窗口,因为SplashScreen关闭了MessageBox》经验,为你挑选了2个好方法。

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

根据这个反馈,这是因为MessageBox.Owner是启动画面,一旦另一个窗口打开,即使它是一个MessageBox,关闭启动画面窗口然后关闭MessageBox,所以用户永远不会看到消息框.

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

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



1> dthrasher..:

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

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

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

2)创建非模态消息窗口.将您的启动模式更改为显式关闭,并使用非模态窗口显示您的消息.在StackOverflow问题的答案中描述了这种方法:

如果在WPF 4.0中使用启动画面,带有异常详细信息的MessageBox会立即消失

3)两次调用MessageBox.显然,该问题仅影响显示的第一个模态对话框.所以你可以简单地调用你的模态对话框两次,如果你不介意第一次打开和关闭的闪光.

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

就个人而言,我不喜欢这些变通办法.唯一的另一个选择是避免内置的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



2> Alain..:

我自己想出了这个解决方案,所以也许它有问题,但它似乎完美无缺:

Window temp = new Window() { Visibility=Visibility.Hidden };
temp.Show();
MessageBox.Show(temp, "An error occurred before the application could start.\n\nTechnical Details: " + ex.Message, "Fatal Error", MessageBoxButton.OK, MessageBoxImage.Stop);
App.Current.Shutdown(1);


简单的解决方法.但是,"Visibility = Visibility.Hidden"并不是真正需要的,因为无论如何你都要显示窗口.相反,为了避免后台窗口的启动显示,我使用了:`new Window {WindowState = WindowState.Minimized,ShowInTaskbar = false}`
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有