无法在WPF中设置DialogResult

我在调用窗口中使用ShowDialog()显示一个WPF窗口。 窗口打开,按预期模态。 但是,在我的确定和取消按钮的对话窗口中的单击事件中,我分别设置了this.DialogResult = true(或false),并且未设置该值。 窗口按预期关闭,但DialogResult仍为null。

这是WPF中的错误吗? 或者是否有原因无法设置DialogResult属性但不会抛出exception? 该窗口未托管在浏览器中。

调用窗口中的代码:

Window2 win = new Window2(); bool? result = win.ShowDialog(); if (result.HasValue && result.Value) { //never gets here because result is always null } 

对话框窗口中的代码:

 this.DialogResult = true; 

DialogResult是一个可以自欺欺人的布尔。 但是你不必为了获得它的价值而施展它。

 bool? result = myWindow.ShowDialog(); if (result ?? false) { // snip } 

?? ?? 如果结果为null,则设置要返回的默认值。 更多信息: 使用Nullable类型(C#编程指南)

至于原始问题,我唯一看到并追踪此问题的时间是在设置DialogResult和关闭窗口之间处理窗口的时间。 不幸的是,我能提供的唯一建议是逐步完成代码并检查操作的顺序。 我相信我通过设置DialogResult然后显式关闭窗口来“修复”它。

首先,你必须考虑到它返回一个可以为空的bool(bool?),所以为了比较它或将它设置为另一个变量你必须将它转换为常规bool

 bool result = (bool)myWindow.DialogResult; 

至于它是null …我不明白为什么会发生这种情况,除非它被设置为true或false后以某种方式被设置回null。 你能展示你的代码吗?

编辑:

你的代码对我来说很好,这就是我在第二个窗口中所拥有的:

 private void button2_Click(object sender, RoutedEventArgs e) { this.DialogResult = false; } private void button1_Click(object sender, RoutedEventArgs e) { this.DialogResult = true; } 

在Window1中:

 private void window1_Loaded(object sender, RoutedEventArgs e) { Window2 win = new Window2(); bool? result = win.ShowDialog(); if (result.HasValue && result.Value) { //it DID get here } } 

有什么大不同吗?

我刚刚遇到了完全相同的问题,它似乎是由我重写OnClosing()方法引起的。 我需要重写OnClosing()来阻止用户通过关闭(X)按钮关闭模态窗口。

当我注释掉OnClosing()方法时,问题就会消失,并且返回的DialogResult的预期值为true或false,如set所示。

感兴趣的是我的按钮点击处理程序和OnClosing方法:

 private void AlternateButton_Click(object sender, RoutedEventArgs e) { this.DialogResult = false; buttonHasBeenClicked = true; this.Close(); } private void DefaultButton_Click(object sender, RoutedEventArgs e) { this.DialogResult = true; buttonHasBeenClicked = true; this.Close(); } protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { base.OnClosing(e); if (!buttonHasBeenClicked) { // Prevent the user closing the window without pressing one of the buttons. e.Cancel = true; } } 

我也遇到过这个问题,我发现修复它的唯一方法就是在我的类中使用这个代码:

 public new bool? DialogResult { get; set; } 

设置我的DialogResult后,它对我有用!! (非常奇怪的问题)。 这是我使用的代码:

 cmdCancel = new RelayCommand(() => { DataContact.Reload(); this.DialogResult = false; this.Close(); }); 

并打开我的对话框:

 public static MessageBoxResult ShowQuestionYesNo(string message) { POLMessageBox w = new POLMessageBox("سوال", MessageBoxType.QuestionYesNo, message); w.ShowDialog(); var b = w.DialogResult; if (b == true) return MessageBoxResult.Yes; if (b == false) return MessageBoxResult.No; return MessageBoxResult.No; } 

在设置DialogResult之前关闭窗口吗? 您应该发布按钮事件处理程序的全部内容。

我也遇到了这个问题。 事实certificate我已将DialogResult设置在IF语句的括号内,因此(尽管可能看起来很奇怪)导致了错误。 一旦删除此单行,问题就解决了。

 private void OKButton_Click(object sender, RoutedEventArgs e) { if (!string.IsNullOrEmpty(startBlockPosBox.Text)) { .. do stuff .. } else { .. do stuff .. DialogResult = true; // this line caused the problem } DialogResult = true; } 

我在对话框窗口页面中有以下内容。 (dialogwindow.xaml.cs)

  private void dlgWindowYesButton_Click(object sender, RoutedEventArgs e) { this.DialogResult = true; this.Close(); } private void dlgWindowNoButton_Click(object sender, RoutedEventArgs e) { this.DialogResult = false; this.Close(); } 

在调用页面中,我使用了如下对话框:

 dialogwindow dWinObj = new dialogwindow(); if(dWinObj.ShowDialog().Value == true) { //perform the operation when the user clicks "Yes" } 

问题是由于表格的生命周期:

Dialog事件 private void _loginViewModel_LoginEvent(object sender,LoginViewModel.LoginEventArgs e){DialogResult = true; this.Close(); }

作品:

 var login = new Login(); var result = login.ShowDialog(); 

不起作用:

 var result = new Login().ShowDialog(); 

我有一个类似的问题,但我的问题来自我的结束语中的代码。 我试图在窗口关闭之前Dispose()一个List,然后将List <>属性设置为null …当我试图将其值设置为null时,它在set属性上窒息所以我想出了在我的set属性方法中遵循笨拙的解决方法,之后一切正常:

  List settingItems; public IEnumerable Settings { get { return settingItems.OrderBy(t => t.Name).AsEnumerable(); } set { if (value == null) { settingItems.Clear(); } else { settingItems = value.ToList(); } } }