代码之家  ›  专栏  ›  技术社区  ›  adriaanp

如何将wpf messagebox.owner设置为桌面窗口,因为splashscreen关闭了messagebox

  •  9
  • adriaanp  · 技术社区  · 17 年前

    我正在使用 飞溅屏幕 通过设置位图的 构建动作 溅到屏幕上。在初始屏幕后面,正在检查许可信息,如果失败,我将显示 对话框 .

    根据这个 Feedback ,这是因为messagebox.owner是初始屏幕,一旦打开另一个窗口,即使它是一个消息框,也会关闭初始屏幕窗口,然后关闭该消息框,这样用户就不会看到该消息框。

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

    是否可以将messagebox.owner设置为桌面窗口?如何,因为唯一想到的另一个功能是 获取桌面窗口() API函数,但返回一个窗口句柄和MessageBox.Owner是一个WPF窗口。

    7 回复  |  直到 12 年前
        1
  •  9
  •   Community Mohan Dere    9 年前

    正如@nir在回答中指出的那样,使用桌面窗口作为模式对话框的父窗口不是一个好主意,下面是其他三个解决方法:

    1)使用隐藏窗口。创建一个小的、非模式的窗口,作为消息框或其他模式对话框的父窗口。此方法如下所述:

    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)给消息框打两次电话。显然,问题只影响显示的第一个模态对话框。所以,如果你不介意前一个打开和关闭时的闪光,你可以简单地打两次模态对话。

    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
  •  9
  •   Alain    14 年前

    我自己想出了这个解决方案,所以也许它有问题,但它似乎工作得很好:

    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);
    
        3
  •  4
  •   svick Raja Nadar    15 年前

    我发现了问题。我也在使用内置的闪屏,这导致了: WPF SplashScreen closes MessageBox

        4
  •  1
  •   Matt Hamilton    17 年前

    你能贴些密码吗?我刚尝试在新的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);
    }
    

    …它按预期工作(在我作出响应之前,“确认启动”提示保持打开状态,如果我单击“否”,应用程序将关闭)。

        5
  •  1
  •   Nir    17 年前

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

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

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

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

        6
  •  0
  •   Amit kumar thakur    17 年前

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

    以下是WPF中一个简单的示例,其中包含修改 现在开始工作了

    点击按钮

    粘贴此代码

    if(system.windows.forms.messagebox.show(“确定”,“删除”,system.windows.forms.messageboxbuttons.yesno,system.windows.forms.messageboxicon.question)==system.windows.forms.dialogresult.yes) { 这个。 } 其他的 { messagebox.show(“为什么不删除”); }

        7
  •  0
  •   RenniePet    12 年前

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

    正如@dthraser提到的,一种解决方案是使用隐藏的虚拟窗口。但有时候,即使这样也不够。我遇到过这样一种情况,解决方案不仅要使用隐藏的虚拟窗口,而且要在每次使用MessageBox时打开其最上面的属性。

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