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

时间:2009-02-23 04:14:39

标签: wpf messagebox

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

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

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

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

8 个答案:

答案 0 :(得分:9)

由于使用桌面窗口作为模态对话框的父窗口并不是一个好主意,正如@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功能并从头开始自己动手。如果您想进一步调查该路线,可以使用以下链接:

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

答案 1 :(得分:9)

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

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);

答案 2 :(得分:4)

我发现了问题。我也在使用内置启动画面,这会导致:WPF SplashScreen closes MessageBox

答案 3 :(得分: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);
}

...它按预期工作(“确认开始”提示保持打开,直到我回复,如果我点击“否”,应用程序关闭)。

答案 4 :(得分:1)

桌面窗口永远不是正确的父级,请阅读此内容以了解原因:

http://blogs.msdn.com/oldnewthing/archive/2004/02/24/79212.aspx

现在这篇文章中描述的问题并没有发生太多,因为MS解决了这个问题,在这篇文章中你可以看到:

http://blogs.msdn.com/oldnewthing/archive/2006/11/02/931674.aspx

答案 5 :(得分:0)

这对我帮助很大..... 鉴于我的新想法 但是我在这里看到的示例代码需要进行一些修改

这是wpf中的一个简单示例,经过修改 现在它正在运作

点击按钮

粘贴此代码

if(System.Windows.Forms.MessageBox.Show(“你确定”,“删除”,System.Windows.Forms.MessageBoxButtons.YesNo,System.Windows.Forms.MessageBoxIcon.Question)== System.Windows .Forms.DialogResult.Yes)             {                 this.Close();             }             其他             {                 MessageBox.Show(“为什么不删除”);             }

答案 6 :(得分:0)

这与OP的情况没有直接关系,但对于在某些特殊情况下MessageBox隐藏在其他窗口后面的问题可能会有用。

正如@dthrasher所提到的,一种解决方案是使用隐藏的虚拟窗口。但有时甚至这还不够。我遇到的情况是,解决方案不仅要使用隐藏的虚拟窗口,还要在我使用MessageBox时打开其TopMost属性。

     _formKludge.TopMost = true;

     MessageBox.Show(_formKludge, "Nice informative message.", "Super-duper Program",
                     MessageBoxButtons.OK, MessageBoxIcon.Error);

     _formKludge.TopMost = false;

答案 7 :(得分:0)

这个问题还是个问题,我最近遇到了。对我来说,解决方案是在出现任何问题时立即关闭启动画面:

/*
This is a comment

and another comment.
this one too.
*/

This is NOT a comment.

之后 MessageBox 正常显示。