30

我使用调用窗口中的 ShowDialog() 显示 WPF 窗口。窗口打开并且是模态的,如预期的那样。但是,在对话框窗口中的“确定”和“取消”按钮的单击事件中,我分别设置了 this.DialogResult = true (或 false),并且没有设置该值。窗口按预期关闭,但 DialogResult 仍然为空。

这是 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;
4

10 回答 10

18

DialogResult是一个可为空的布尔值。但是,您不必强制转换它来获得它的价值。

bool? result = myWindow.ShowDialog();
if (result ?? false)
{
  // snip
}

这 ??如果结果为空,则设置要返回的默认值。更多信息: 使用 Nullable 类型(C# 编程指南)

至于最初的问题,我唯一一次看到并追踪到这个问题是在设置 DialogResult 和关闭窗口之间设置窗口时。不幸的是,我能提供的唯一建议是让您逐步检查代码并检查操作的顺序。我相信我通过设置DialogResult然后显式关闭窗口来“修复”它。

于 2009-05-24T23:36:37.813 回答
10

那么首先你必须考虑到它返回一个可为空的布尔值(布尔值?),所以为了比较它或将它设置为另一个变量,你必须将它转换为一个普通的布尔值

bool result = (bool)myWindow.DialogResult;

至于它是空的......我不明白为什么会发生这种情况,除非它在设置为真或假之后以某种方式被设置回空。你能显示你的代码吗?

编辑:

你的代码对我来说很好,这就是我在第二个窗口中的内容:

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
    }
}

有什么大的区别吗?

于 2009-05-22T16:28:55.060 回答
8

我刚刚遇到了完全相同的问题,这似乎是由我重写 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;
    }
}
于 2011-11-08T07:21:46.207 回答
4

我也遇到过这个问题,我发现解决它的唯一方法是在我的类中使用这个代码:

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;
        }
于 2011-12-11T03:48:35.963 回答
2

在设置 DialogResult 之前关闭窗口吗?您应该发布按钮事件处理程序的全部内容。

于 2009-06-12T15:07:49.973 回答
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;
    }
于 2013-11-11T19:06:32.813 回答
0

问题是由于表单的生命周期:

对话事件 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();
于 2018-07-17T16:27:52.790 回答
0

我在对话框窗口页面中有以下内容。(对话框窗口.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"
}
于 2016-02-10T22:07:30.057 回答
0

我通过在 add和returnthis.close()之后添加解决了这个问题。this.DialogResult=truewindow.ShowDialog()true

private void Button1_Click(object sender, RoutedEventArgs e)
{
    this.Close();
    this.DialogResult = true;
}
于 2020-06-04T10:45:12.763 回答
-1

我有一个类似的问题,但我的问题来自我结束语中的代码。我试图在窗口关闭之前 Dispose() 一个 List,然后将 List<> 属性设置为 null ......在我的 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();
            }
        }
    }
于 2017-06-16T22:43:12.267 回答