13

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

根据此反馈,这是因为 MessageBox.Owner 是启动屏幕,并且一旦打开另一个窗口,即使它是 MessageBox,启动屏幕窗口也会关闭,然后又关闭 MessageBox,因此用户永远不会看到消息框。

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

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

4

8 回答 8

11

由于使用桌面窗口作为模态对话框的父级不是一个好主意,正如@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

于 2011-03-16T16:40:13.297 回答
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);
于 2012-06-01T17:08:04.460 回答
3

我发现了问题。我还使用了导致此问题的内置启动画面:WPF SplashScreen closes MessageBox

于 2009-02-23T04:27:52.663 回答
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);
}

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

于 2009-02-23T04:20:52.587 回答
0

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

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

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

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

于 2009-02-24T15:38:05.090 回答
0

这个问题仍然是一个问题,我最近遇到了它。对我来说,解决方案是在出现任何问题时立即关闭启动屏幕:

        SplashScreen splash = new(Assembly.GetAssembly(typeof(GuiApp))!, "Resources/img_my.png");
        splash.Show(false);

        using ServiceProvider? services = initializeApp();

        if (services == null)
        {
            splash.Close(TimeSpan.Zero);
            return -3;
        }

之后 MessageBox 正常显示。

于 2021-07-29T13:43:47.920 回答
-1

这对我帮助很大......给了我新的想法,但我在这里看到的示例代码需要一些修改

这是 wpf 中的一个简单示例,现在可以修改

点击按钮

粘贴此代码

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

于 2009-07-15T10:45:08.003 回答
-1

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

正如@dthrasher 提到的,一种解决方案是使用隐藏的虚拟窗口。但有时即使这样也不够。我遇到的情况是,解决方案不仅是使用隐藏的虚拟窗口,而且每当我将它与 MessageBox 一起使用时都打开它的 TopMost 属性。

     _formKludge.TopMost = true;

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

     _formKludge.TopMost = false;
于 2014-03-22T14:05:20.463 回答