qui*_*api 29 c# wpf modal-dialog dialogresult
我在调用窗口中使用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
}
Run Code Online (Sandbox Code Playgroud)
对话框窗口中的代码:
this.DialogResult = true;
Run Code Online (Sandbox Code Playgroud)
Den*_*nis 18
DialogResult
是一个可空的布尔.但是你不必为了获得它的价值而施展它.
bool? result = myWindow.ShowDialog();
if (result ?? false)
{
// snip
}
Run Code Online (Sandbox Code Playgroud)
?? ?? 如果结果为null,则设置要返回的默认值.更多信息: 使用Nullable类型(C#编程指南)
至于原始问题,我唯一一次看到并追踪这个问题的时候是在设置DialogResult和关闭窗口之间处理窗口的时候.不幸的是,我能提供的唯一建议是逐步完成代码并检查操作的顺序.我相信我通过设置DialogResult
然后明确关闭窗口来"修复"它.
Car*_*rlo 11
首先,你必须考虑到它返回一个可以为空的bool(bool?),所以为了比较它或将它设置为另一个变量你必须将它转换为常规bool
bool result = (bool)myWindow.DialogResult;
Run Code Online (Sandbox Code Playgroud)
至于它是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;
}
Run Code Online (Sandbox Code Playgroud)
在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
}
}
Run Code Online (Sandbox Code Playgroud)
有什么大不同吗?
我刚刚遇到了完全相同的问题,它似乎是由于我重写了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;
}
}
Run Code Online (Sandbox Code Playgroud)