当在当前用户测试的客户端应用程序中捕获未处理的异常时,我创建了这样的代码。
catch(Exception ex)
{
var result = MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK);
Current.Shutdown();
}
但是消息框只会很快出现,然后程序关闭。为什么代码不等待结果显而易见。我该怎么做?
答案 0 :(得分:5)
我有类似的问题。问题是在显示主窗口之前抛出异常,因此没有窗口显示消息框。 Swamy的回答仅仅是一个时间延迟,因此可以初始化窗口。 IMO不太优雅。找到了更好的解决方案[这里] WPF MessageBox not waiting for result [WPF NotifyIcon]。
只需在MessageBoxOptions.DefaultDesktopOnly
中指定MessageBox.Show(....) method
。
答案 1 :(得分:3)
从文档到MessageBox
类:
消息框始终具有所有者窗口。默认情况下,消息框的所有者是在打开消息框时当前在应用程序中处于活动状态的窗口。但是,您可以使用多个
Window
重载之一为Show
指定其他所有者。有关所有者窗口的详细信息,请参阅Window.Owner
。
因此,您的问题非常类似于this question,其中应用程序存在之前,用户已关闭消息框。
首先要尝试将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 sample。您应该能够看到this
作为所有者窗口传递的位置与传递null
的位置之间的差异。
答案 2 :(得分:1)
您是在脚本或实际的.net应用程序中使用此代码吗? 消息框按钮中缺少“s”。 你应该写这样的代码:
try
{
throw new Exception("My new exception");
}
catch (Exception ex)
{
DialogResult result = MessageBox.Show(ex.Message, "Error",MessageBoxButtons.OK);
}
如果这不起作用,您应该查看抛出异常的代码以进行进一步的调试...
答案 3 :(得分:0)
这是一个非常古老的问题,但可能在答案之下可能会解决其他问题,
我有同样的情况,我希望在创建主窗口之前显示消息框,而在我的情况下,消息Box正在消失在我单击确定之前,应用程序将关闭。
我正在使用异步并等待并添加低至10毫秒的延迟解决了我的问题。(因为主窗口在那时加载)
await Task.Delay(10);
if (MessageBox.Show(MainWindow, "Message", "Error", MessageBoxButton.OK) == MessageBoxResult.OK)
{
Current.Shutdown();
}
可能对于非异步方法,Thread.Sleep也可以工作(未尝试)。