不等待messageBox的结果

5

在用户测试中,当捕获到客户端应用程序中未处理的异常时,我编写了如下代码:

catch(Exception ex)
{
    var result = MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK);
    Current.Shutdown();
}

但消息框只出现了很短的时间,然后程序就关闭了。为什么代码不等待结果显现呢?我该如何做到这一点?


那不应该发生。使用调试器找出其他正在发生的事情。 - SLaks
1
在消息框参数的开头使用 null,这将使消息框成为一个独立且顶层的界面。 - greatmajestics
这是在启动时发生的,我猜那可能是问题所在。在mainWindow被解析之前就完成了。 - Ingó Vals
我们需要更多的线索。你发布的代码(除了 Current.Shutdown(),我不知道 Current 是什么)可以正常工作(消息框在创建任何窗口之前就显示出来,在按下 OK 之前不会退出)。 - Peter Ritchie
5个回答

6
我遇到了类似的问题。问题在于异常在主窗口显示之前被抛出,因此没有窗口可以显示消息框。Swamy的答案仅强制延迟时间,以便初始化窗口。我认为这不太优雅。在这里找到了更好的解决方案:WPF MessageBox not waiting for result [WPF NotifyIcon]
只需在MessageBox.Show(....)方法中指定MessageBoxOptions.DefaultDesktopOnly即可。

3
根据 MessageBox 类的文档:
弹出窗口消息框始终有一个所有者窗口。默认情况下,消息框的所有者是应用程序中当前活动的窗口,在打开消息框时选择。但是,你可以通过使用其中几个Show重载来指定其他 Window 的所有者。有关所有者窗口的详细信息,请参见 Window.Owner
因此,你的问题与此问题非常相似,应用程序在用户关闭消息框之前就已存在。
第一件要尝试的事情是将null作为Window参数传递。
MessageBox.Show(null, ex.Message, "Error", MessageBoxButton.OK);

如果您有一个Window类的实例,例如您的主窗口对象,请将其传递而不是null:
MessageBox.Show(mainWindow, ex.Message, "Error", MessageBoxButton.OK);

如果你目前正在使用任何主窗口方法,你可以将this作为窗口传递:

MessageBox.Show(this, ex.Message, "Error", MessageBoxButton.OK);

只有在此时没有主窗口对象可用的情况下才使用null

请查看MessageBox示例。您应该能够看到传递this作为所有者窗口和传递null之间的区别。


好的,null只会抛出一个空引用异常,但我想知道如果拥有窗口当前还没有调用Show()方法,它作为一个适当的所有者仍然可以吗? - Ingó Vals
是的,所有者窗口可以不可见在屏幕上。 - Alexey Ivanov
当使用 null 时,可能会不清楚要调用哪个函数。为了明确起见,您可以将 null 强制转换为 Window 或创建一个本地变量 Window owner = null 并将 owner 变量用作 Show 的参数。 - Alexey Ivanov

2
你是在脚本中使用这段代码还是实际的 .net 应用程序中使用? 你漏掉了消息框按钮中的 "s"。 你应该像这样编写代码:
try
{
    throw new Exception("My new exception");
}
catch (Exception ex)
{
    DialogResult result = MessageBox.Show(ex.Message, "Error",MessageBoxButtons.OK);
} 

如果这个方法不起作用,你应该查看抛出异常的代码以进行进一步调试...

我猜你的代码是来自Windows Forms,因为MessageBoxButton是正确的,结果是MessageBoxResult。虽然我尝试过了,但没有改变任何东西。我认为这与我在主窗口创建之前实例化此消息框有关。 - Ingó Vals
拥有两个不同的MessageBox类大致执行相同的功能是很好的事情:System.Windows.Forms.MessageBoxSystem.Windows.MessageBox。我认为这相当令人困惑,特别是在提问时。虽然问题标记了wpf,这意味着使用System.Windows.MessageBox - Alexey Ivanov

0

这是一个很老的问题,但可能下面的答案可以帮助其他人,

我遇到了同样的情况,我想在主窗口创建之前显示消息框,在我的情况下,消息框在我点击“确定”之前消失了,应用程序就会关闭。

我正在使用async和await,并且添加了10毫秒的延迟,这为我解决了问题。(因为主窗口在那时已经加载)

await Task.Delay(10);
if (MessageBox.Show(MainWindow, "Message", "Error", MessageBoxButton.OK) == MessageBoxResult.OK)
{
    Current.Shutdown();
}

对于非异步方法,Thread.Sleep 也可能有效(未尝试过)。


0
在非异步方法中显示任何窗口之前,这对我解决了问题:
 if (Task.Run(() => MessageBox.Show("test", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error)).Result == MessageBoxResult.OK)
 {
     Environment.Exit(1);
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接