2009-06-12 54 views

回答

5

在我看來,這是因爲在大多數情況下,你不需要廣義專門的選項,如重試或忽略。

如果您需要超過確定/取消,您應該使用某種任務對話框,例如,寫出答案。這樣,您不僅僅限於幾十年前人們想到的少數枚舉值,而且DialogResult對於基本使用只是正面/負面,您可以實現自己的屬性,該屬性特定於您的高級需求。因此只需要true/false,而null表示窗口尚未關閉(尚未爲該屬性賦值)。

如果您的對話不僅僅是用戶應該回答的問題(例如,一個參賽表格),通常OK/Cancel會更好,所以你不需要更多的值。

2

根據the MSDN documentation

的DialogResult爲空時,將顯示對話框 框,但既不接受,也不 取消。

但我不確定這是怎麼發生的,除非你正在處理多線程訪問對話框。

文檔說是假的時,下面的事情發生一個:

  • PressesALT + F4。
  • 點擊關閉按鈕。
  • 從系統菜單中選擇關閉。
+0

我認爲這發生在用戶點擊窗口右上角的關閉按鈕時。 – 2009-06-12 15:40:12

+0

不是根據我鏈接到的文檔...我會編輯更多詳細信息 – 2009-06-12 15:46:44

+0

@Max,如果你打電話給`Show`,然後通話返回給你(即它是一個非阻塞呼叫),所以你可以立即詢問「DialogResult」值。只有當你調用ShowDialog時,調用纔會被阻止,直到對話框被解除。但是,在後一種情況下,您仍然可以自由地從另一個線程詢問對象,就像您指出的那樣。 – 2009-11-06 16:44:27

14

DialogResult屬性是基於Window類中定義。並非所有的Window都是對話框。因此,該屬性與所有窗口無關。已經通過Show()而不是ShowDialog()顯示的Window將會(假設,除非您由於某種原因而設置)具有DialogResult = null

這裏有一個簡單的例子來說明:

Window1.xaml

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <Button Name="b1">Show</Button> 
     <Button Name="b2">ShowDialog</Button> 
    </StackPanel> 
</Window> 

Window1.xaml.cs

using System.Windows; 

namespace WpfApplication1 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      b1.Click += new RoutedEventHandler(b1_Click); 
      b2.Click += new RoutedEventHandler(b2_Click); 
     } 

     void b1_Click(object sender, RoutedEventArgs e) 
     { 
      var w = new Window(); 
      w.Closed += delegate 
      { 
       MessageBox.Show("" + w.DialogResult); 
      }; 

      w.Show(); 
     } 

     void b2_Click(object sender, RoutedEventArgs e) 
     { 
      var w = new Window(); 
      w.ShowDialog(); 
      MessageBox.Show("" + w.DialogResult); 
     } 
    } 
} 

當您關閉窗戶,你會注意到該對話框的DialogResultfalse,而非對話框有null DialogResult

+0

雖然這是真實的並且可能是相關的,但在DialogResult枚舉中已經有一個'None'值,它在本例中非常舒適地實現了null的目的。所以我懷疑有一個空值是否有足夠的理由從已建立的模型中移出。 – 2009-06-12 15:45:03

0

ShowDialog將始終返回true或false。當對話框打開時,DialogResult只會處於空狀態。從null過渡到true或false將關閉對話框並對ShowDialog返回進行原始調用。

0

IMO這是因爲DialogResult並不總是被使用。你看,如果你的窗口被ShowDialog()方法調用,如果你用它的Show()方法調用它,並且設置DialogResult爲任何東西,它將會拋出一個InvalidOperationException,你只能設置DialogResult。所以我認爲這就是它可以爲空的原因,如果你使用Show()方法調用窗口,它將爲null,如果你使用ShowDialog()調用它,這取決於你。

相關問題