如何将WPF MessageBox.所有者设置为桌面窗口,因为SplashScreen关闭了Message Box
-
05-09-2019 - |
题
我正在使用 飞溅屏幕 通过设置Bitmap的功能 建立动作 要飞溅。在飞溅屏幕后面,正在检查许可信息,如果失败,我会显示一个 消息框.
根据这个 反馈, ,这是因为MessageBox.hower是Splash屏幕,并且即使是MessageBox,Splash屏幕窗口已关闭,即使另一个窗口打开,它也会关闭消息框,因此用户永远不会看到MessageBox。
因此,解决方法是将MessageBox.所有者设置为另一个窗口,但这意味着我必须实例化另一个甚至可能不需要的窗口。
可以将MessageBox.所有者设置为桌面窗口吗?以及如何,因为唯一想到的其他功能是 getDesktopWindow() API函数,但这返回一个窗口句柄和MessageBox.howner是WPF窗口。
解决方案 3
我发现了这个问题。我还使用了引起这一点的建筑飞溅屏幕: WPF SplashScreen关闭消息框
其他提示
由于使用桌面窗口作为模态对话框的父母不是一个好主意,正如@nir在答案中指出的那样,这里还有其他三个解决方法:
1)使用隐藏的窗口。创建一个微小的非模式窗口,充当您的消息框或其他模态对话框的父。此处描述了这种方法:
http://social.msdn.microsoft.com/forums/en-us/wpf/wpf/thread/116bcd83-93bf-42f3-9bfe-da9e7de37546/
2)创建非模式消息窗口。更改您的启动模式以显式关闭,并使用非模式窗口显示您的消息。此方法在此堆栈流问题的答案中描述了:
如果WPF 4.0中使用Splash屏幕,则具有异常细节的消息框立即消失
3)两次通话消息框。显然,问题仅影响显示的第一个模态对话框。因此,如果您不介意第一个开口和关闭的闪光灯,则可以两次调用模态对话框。
就个人而言,我不喜欢这些解决方法。唯一的选择是避免内置的飞溅功能并从头开始滚动。如果您想进一步调查该路线,则是一个链接:
http://social.msdn.microsoft.com/forums/en-us/wpf/wpf/thread/8dd49fd0-9cc9-43c6-b285-6f119ab8a32e/
最后,如果您像我一样对这个问题感到烦恼,则可以在此处投票给Microsoft修复此错误:
我自己想出了这个解决方案,所以也许有问题,但是它似乎很完美:
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);
您可以发布一些代码吗?我刚刚尝试在新的WPF应用程序中将其添加到app.xaml.cs文件:
protected override void OnStartup(StartupEventArgs e)
{
if (MessageBox.Show("Start app?", "Confirm Start",
MessageBoxButton.YesNo) == MessageBoxResult.No)
{
this.Shutdown();
return;
}
this.StartupUri = new Uri("Window1.xaml", UriKind.Relative);
base.OnStartup(e);
}
...并且它可以按预期工作(“确认开始”提示保持打开状态,直到我响应,如果我单击“否”应用程序关闭)。
桌面窗口永远不是正确的父母,请阅读以了解原因:
http://blogs.msdn.com/oldnewthing/archive/2004/02/24/79212.aspx
现在,这篇文章中描述的问题并没有发生太多,因为MS围绕它进行了工作,在本文中,您可以看到::
http://blogs.msdn.com/oldnewthing/archive/2006/11/02/931674.aspx
这对我有很大帮助.....给了我新的想法,但是我在这里看到的示例代码需要进行一些修改
这是WPF中的一个简单示例,并进行了修改,它正在工作
单击按钮
粘贴此代码
if(System.Windows.Forms.messagebox.show(“您确定”,“ delete”,System.windows.forms.messageboxbuttons.yesno,system.windows.forms.messages.messageboxicon.question)== system.windows.forms.forms。 dialogresult.yes){this.close(); } else {MessageBox.Show(“为什么不删除”); }
这与OP的情况无关,但对于在某些特殊情况下隐藏在其他窗口后面的其他问题的人可能有用。
正如@dthrasher所提到的那样,一种解决方案是使用隐藏的虚拟窗口。但是有时候这还不够。我的情况是,解决方案不仅要使用隐藏的虚拟窗口,而且要在我将其与MessageBox一起使用时打开其最高属性。
_formKludge.TopMost = true;
MessageBox.Show(_formKludge, "Nice informative message.", "Super-duper Program",
MessageBoxButtons.OK, MessageBoxIcon.Error);
_formKludge.TopMost = false;