我在关闭对话框时遇到了问题,但只是在第二次显示时才出现问题,只有在以某种方式关闭对话框时才会出现问题。
对话框上有一个单独的按钮,声明为取消按钮,即它具有IsCancel =“True”。按钮单击没有事件处理程序。我可以显示这个对话框,每次单击按钮或按Esc键关闭它,并且没有问题,它每次都有效。
我也有用户会话的概念。如果用户的会话到期,则应自动关闭所有打开的对话框。当会话在第一次显示对话框时到期时,这可以正常工作,但是如果对话框已经显示一次,并且通过明确单击按钮关闭,或者允许会话到期,那么当下一个会话到期时显示对话框时,我得到异常“只有在创建Window并显示为对话框后才能设置DialogResult。”
这很奇怪,因为我可以在第二个会话到期之前查看对话框的DialogResult,它是null。当我在会话到期时设置断点并且我即将设置DialogResult时,DialogResult 已经设置为false。我不知道这是怎么设置为假的。
我正在使用Unity,并想知道它是否每次都给我相同的对话实例。但如果是这样的话,一旦我解决了对话框的引用,DialogResult就不会是假的吗?它不是,它像我期望的那样是空的。
我查看了this,this,this和this,但都没有帮助。
这是我获得参考并显示对话框的地方
public void ShowLoginBarcode(string username) {
BarcodeLoginForm frm = _Unity.Resolve<BarcodeLoginForm>();
frm.Owner = Application.Current.MainWindow;
BarcodeLoginVM vm = frm.ViewModel;
vm.Username = username;
frm.ShowDialog();
}
这是对话框的xaml.cs
public partial class BarcodeLoginForm : Window, ICloseableDialog {
public void CloseDialog(bool dialogResult) {
DialogResult = dialogResult;
}
private void Window_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) {
// register the view with the view model, so the view model can call the view's CloseDialog method
if (e.OldValue != null)
((BarcodeLoginVM)e.OldValue).SetView(null);
if (e.NewValue != null)
((BarcodeLoginVM)e.NewValue).SetView(this);
}
}
这是视图模型的一部分。
public void SetView(ICloseableDialog view) {
_Dialog = view;
}
private void Session_OnTimeoutChange(object sender, EventArgs e) {
if (_Session.HasExpired)
CloseDialog(false);
}
private void CloseDialog(bool dialogResult) {
_Dialog?.CloseDialog(dialogResult);
}
以下是显示问题的最简单步骤:
那么,有什么想法吗?
修改: 我可以通过更改xaml.cs CloseDialog方法来解决问题,以便在分配值之前检查DialogResult是否为null,但我不明白为什么这应该是必要的。在执行此代码之前如何设置DialogResult?
public void CloseDialog(bool dialogResult) {
if (!DialogResult.HasValue)
DialogResult = dialogResult;
}