我正在尝试处理对话框中的异常,以便在发生任何异常时,对话框将被关闭,应用程序不会崩溃。如您所见,我使用一个简单的 try-catch 块:
IDialogView dialog = null;
try
{
if (_dialogViewModel == null)
{
dialog = ViewFactory.SomeDialog();
_dialogViewModel = new DialogViewModel(dialog);
_dialogViewModel.LoadData();
}
_dialogViewModel.ShowDialog();
}
catch (Exception ex)
{
if (dialog != null)
dialog.Close();
_dialogViewModel = null;
MessageBox.Show("Sorry, there was an error in the dialog.", "Error",
MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
当按钮的CanExecute()
事件处理程序中发生错误时,会发生此问题。错误已成功捕获,但是当我向用户显示MessageBox
时,CanExecute()
再次执行,因此错误再次发生。最后,它会导致应用程序崩溃。
我已经用谷歌搜索了一些信息,据说可以确保CanExecute()
事件处理程序中没有异常。但是这样的事情可能会发生在其他地方,这就是为什么我想简单地捕获对话框入口点中的所有异常而不使用每种方法。
所以,我的问题是:如何销毁对话框,以便在异常捕获后它不再显示? Close()
不起作用,因为在关闭之前它仍然调用CanExecute()
.
正如你在谷歌上发现的那样,你应该确保CanExecute
处理程序是 a) 轻量级和 b) 永远不会抛出异常。 您遇到了造成这种情况的主要原因:框架将重复自动运行CanExecute
。 它将在焦点更改、输入事件、数据绑定更改以及响应您几乎无法控制的其他一些原因时运行。
问题是:您确实有一个错误,并且该错误反复发生。 这意味着您可以选择崩溃或重复显示对话框。 或者,您可以对错误执行一些操作。
你的答案是:修复错误。
(您的处理程序可以处理您的其他错误。 把它留在那里。 但是这个特定的错误,你需要立即修复。