我在调用窗口中使用ShowDialog()显示一个WPF窗口。窗口打开,按预期模态。但是,在我的确定和取消按钮的对话窗口中的单击事件中,我分别设置了this.DialogResult = true(或false),并且未设置该值。窗口按预期关闭,但DialogResult仍为null。
这是WPF中的错误吗?或者是否有原因无法设置DialogResult属性但不会抛出异常?该窗口未托管在浏览器中。
调用窗口中的代码:
Window2 win = new Window2();
bool? result = win.ShowDialog();
if (result.HasValue && result.Value) {
//never gets here because result is always null
}
对话框窗口中的代码:
this.DialogResult = true;
答案 0 :(得分:18)
DialogResult
是一个可以自欺欺人的布尔。但是你不必为了获得它的价值而施展它。
bool? result = myWindow.ShowDialog();
if (result ?? false)
{
// snip
}
??如果结果为null,则设置要返回的默认值。更多信息: Using Nullable Types (C# Programming Guide)
至于原始问题,我唯一看到并追踪此问题的时间是在设置DialogResult和关闭窗口之间处理窗口的时间。不幸的是,我能提供的唯一建议是逐步完成代码并检查操作的顺序。我相信我通过设置DialogResult
然后明确关闭窗口来“修复”它。
答案 1 :(得分:11)
首先,你必须考虑到它返回一个可以为空的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
}
}
有什么大不同吗?
答案 2 :(得分:7)
我刚刚有完全相同的问题,它似乎是由我重写OnClosing()方法引起的。我需要重写OnClosing()来阻止用户通过关闭(X)按钮关闭模态窗口。
当我注释掉OnClosing()方法时,问题消失了,并且返回的DialogResult的预期值为true或false,如设置的那样。
感兴趣的是我的按钮点击处理程序和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;
}
}
答案 3 :(得分:3)
我也遇到过这个问题,我发现修复它的唯一方法就是在我的类中使用这个代码:
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;
}
答案 4 :(得分:2)
在设置DialogResult之前是否关闭窗口? 您应该发布按钮事件处理程序的全部内容。
答案 5 :(得分:0)
我也遇到了这个问题。事实证明我在一个IF语句的括号内设置了DialogResult,因此(尽管看起来很奇怪)导致了错误。删除此单行后,问题就解决了。
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;
}
答案 6 :(得分:0)
我在对话框窗口页面中有以下内容。 (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"
}
答案 7 :(得分:0)
问题归结于表格的生命期:
对话事件 私有void _loginViewModel_LoginEvent(对象发送者,LoginViewModel.LoginEventArgs e) { DialogResult = true; this.Close(); }
作品:
var login = new Login();
var result = login.ShowDialog();
不起作用:
var result = new Login().ShowDialog();
答案 8 :(得分:0)
我通过在添加this.close()
和this.DialogResult=true
返回window.ShowDialog()
之后添加true
来解决此问题。
private void Button1_Click(object sender, RoutedEventArgs e)
{
this.Close();
this.DialogResult = true;
}
答案 9 :(得分:-1)
我有类似的问题,但我的问题来自我的结束语中的代码。我试图在窗口关闭之前Dispose()一个List,然后设置List<>属性为null ...当我试图将其值设置为null时,它在set属性上窒息所以我在我的set属性方法中提出了以下笨拙的解决方法,之后一切正常:
List<SettingItem> settingItems;
public IEnumerable<SettingItem> Settings
{
get
{
return settingItems.OrderBy(t => t.Name).AsEnumerable();
}
set
{
if (value == null)
{
settingItems.Clear();
}
else
{
settingItems = value.ToList();
}
}
}