在用户测试中,当捕获到客户端应用程序中未处理的异常时,我编写了如下代码:
catch(Exception ex)
{
var result = MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK);
Current.Shutdown();
}
但消息框只出现了很短的时间,然后程序就关闭了。为什么代码不等待结果显现呢?我该如何做到这一点?
在用户测试中,当捕获到客户端应用程序中未处理的异常时,我编写了如下代码:
catch(Exception ex)
{
var result = MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK);
Current.Shutdown();
}
但消息框只出现了很短的时间,然后程序就关闭了。为什么代码不等待结果显现呢?我该如何做到这一点?
MessageBox.Show(....)方法
中指定MessageBoxOptions.DefaultDesktopOnly
即可。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
时,可能会不清楚要调用哪个函数。为了明确起见,您可以将 null
强制转换为 Window
或创建一个本地变量 Window owner = null
并将 owner
变量用作 Show
的参数。 - Alexey Ivanovtry
{
throw new Exception("My new exception");
}
catch (Exception ex)
{
DialogResult result = MessageBox.Show(ex.Message, "Error",MessageBoxButtons.OK);
}
MessageBox
类大致执行相同的功能是很好的事情:System.Windows.Forms.MessageBox
和System.Windows.MessageBox
。我认为这相当令人困惑,特别是在提问时。虽然问题标记了wpf
,这意味着使用System.Windows.MessageBox
。 - Alexey Ivanov这是一个很老的问题,但可能下面的答案可以帮助其他人,
我遇到了同样的情况,我想在主窗口创建之前显示消息框,在我的情况下,消息框在我点击“确定”之前消失了,应用程序就会关闭。
我正在使用async和await,并且添加了10毫秒的延迟,这为我解决了问题。(因为主窗口在那时已经加载)
await Task.Delay(10);
if (MessageBox.Show(MainWindow, "Message", "Error", MessageBoxButton.OK) == MessageBoxResult.OK)
{
Current.Shutdown();
}
对于非异步方法,Thread.Sleep 也可能有效(未尝试过)。
if (Task.Run(() => MessageBox.Show("test", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error)).Result == MessageBoxResult.OK)
{
Environment.Exit(1);
}
Current.Shutdown()
,我不知道Current
是什么)可以正常工作(消息框在创建任何窗口之前就显示出来,在按下 OK 之前不会退出)。 - Peter Ritchie