2009-05-22 99 views
26

我使用ShowDialog()从调用窗口中显示WPF窗口。窗口打开并按预期方式运行。但是,在我的确定和取消按钮的对话窗口中的单击事件中,我分别设置了this.DialogResult = true(或false),并且未设置该值。该窗口按预期关闭,但DialogResult仍然为空。无法在WPF中设置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; 
+0

你如何将DialogResult设置为布尔?它应该是一个枚举,如DialogResult.OK – Brandon 2009-05-22 16:24:21

+12

不,在WPF中,如果使用它的ShowDialog()方法打开Window对象,则可以将DialogResult设置为布尔值。 – Carlo 2009-05-22 16:26:37

+0

添加代码来回答 – Carlo 2009-05-22 16:53:46

回答

9

那么首先你要考虑到它返回一个可空布尔的,所以为了比较它或将它设置为另一个变量,您必须将其转换为常规bool

bool result = (bool)myWindow.DialogResult; 

A因为它是空的......我不明白为什么会发生,除非它设置为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; 
} 

而且在窗口1:

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

有什么大的区别?

18

DialogResult是一个可空的布尔值。但是你不必为了获得它的价值而施展它。

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

该?? ??如果结果为空,则设置返回的默认值。更多信息: Using Nullable Types (C# Programming Guide)

至于原来的问题,我唯一一次看到和追踪这个问题的时候,窗口正在设置DialogResult和关闭窗口之间放置。不幸的是,我可以提供的唯一建议是让您逐步检查代码并检查操作的顺序。我相信我通过设置DialogResult然后明确关闭窗口来“固定”它。

2

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

6

我刚才有正好相同的问题,它似乎是由我重写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

我一直为这个问题太多,唯一的办法,我发现有人使用此代码在我的课来解决:

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

dialogwindow dWinObj = new dialogwindow(); 
if(dWinObj.ShowDialog().Value == true) 
{ 
    //perform the operation when the user clicks "Yes" 
} 
-1

我也有类似的问题,但我的问题从代码我的闭幕词中来了。我试图在窗口关闭前Dispose()列表,然后将列表<>属性设置为null ...当我试图将它的值设置为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(); 
      } 
     } 
    }