无法在WPF中设置DialogResult

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然后明确关闭窗口来"修复"它.

  • `== true`是*永远*隐含的`bool?` (6认同)
  • 我更喜欢`result == true`.我认为它更具可读性,我不得不考虑`??`这里做什么. (4认同)
  • `result == true`是我的一个宠儿.`== true`是隐含的.如果您正在寻找增强的可读性,我建议在它们代表之后命名您的变量.例如:`bool?isOK = myWindow.Dialog(); if(isOK ?? false){...}` (2认同)

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)

有什么大不同吗?

  • @quinnapi哈哈2年后,我遇到了同样的问题.我才意识到自己正在阅读自己的答案.烦! (4认同)
  • 在调试会话中,我在将DialogResult设置为true后立即检查它的值,它仍为null. (2认同)

dod*_*der 8

我刚刚遇到了完全相同的问题,它似乎是由于我重写了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)