无法在WPF中设置DialogResult

时间:2009-05-22 16:18:06

标签: 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
}

对话框窗口中的代码:

this.DialogResult = true;

10 个答案:

答案 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();
            }
        }
    }