4

在当前处于用户测试中的客户端应用程序中捕获未处理的异常时,我编写了这样的代码。

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

但是消息框只会很快出现,然后程序就会关闭。为什么代码不等待结果出现。我该怎么做?

4

5 回答 5

6

我有一个类似的问题。问题是在显示主窗口之前抛出异常,因此没有窗口可以显示消息框。Swamy 的回答只是强制延迟时间,以便可以初始化窗口。IMO 不太优雅。找到了更好的解决方案 [这里] WPF MessageBox not waiting for result [WPF NotifyIcon]

只需MessageBoxOptions.DefaultDesktopOnlyMessageBox.Show(....) method.

于 2015-10-02T09:46:49.727 回答
3

从文档到MessageBox课程:

消息框总是有一个所有者窗口。默认情况下,消息框的所有者是打开消息框时应用程序中当前处于活动状态的窗口。Window但是,您可以使用多个Show重载之一为指定另一个所有者。有关所有者窗口的详细信息,请参阅Window.Owner

因此,您的问题与用户关闭消息框之前存在应用程序的问题非常相似。

首先要尝试的是null作为Window参数传递。

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

如果您有一个Window类的实例,例如您的主窗口对象,请传递它而不是null

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

如果您当前处于任何主窗口方法中,则可以this作为 Window 传递:

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

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

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

于 2012-08-21T19:55:09.647 回答
1

您是在脚本还是实际的 .net 应用程序中使用此代码?您在消息框按钮中缺少“s”。你应该这样写代码:

try
{
    throw new Exception("My new exception");
}
catch (Exception ex)
{
    DialogResult result = MessageBox.Show(ex.Message, "Error",MessageBoxButtons.OK);
} 

如果这不起作用,您应该查看引发异常的代码以进行进一步调试...

于 2012-08-21T17:47:11.920 回答
0

这是一个非常古老的问题,但可能下面的答案可能会帮助其他人,

我有同样的情况,我想在创建主窗口之前显示消息框,在我的情况下,消息框在我点击确定之前消失,应用程序将关闭。

我正在使用异步和等待并添加低至 10 毫秒的延迟为我解决了这个问题。(因为那时主窗口已加载)

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

可能对于非异步方法 Thread.Sleep 也可以工作(未尝试)。

于 2015-01-08T11:43:13.440 回答
0

在非异步方法中显示任何窗口之前,这为我解决了问题:

 if (Task.Run(() => MessageBox.Show("test", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error)).Result == MessageBoxResult.OK)
 {
     Environment.Exit(1);
 }
于 2021-10-27T13:25:33.290 回答