无法在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(); } } }