2009-06-12 11 views

Antwort

5

Meiner Meinung nach wurde dies getan, weil Sie in den meisten Fällen die generalisierten spezialisierten Optionen wie Retry oder Ignore nicht benötigen.

Wenn Sie mehr als OK/Abbrechen benötigen, sollten Sie eine Art von Task-Dialog verwenden, z. mit ausgeschriebenen Antworten. Auf diese Weise sind Sie nicht auf die wenigen Enum-Werte beschränkt, an die jemand vor einigen Jahrzehnten gedacht hat, und das DialogResult ist nur positiv/negativ für die Grundbenutzung und Sie können Ihre eigene Eigenschaft implementieren, die spezifisch für Ihre fortgeschrittenen Bedürfnisse ist. Daher wird nur wahr/falsch benötigt, und null, das anzeigt, dass das Fenster noch nicht geschlossen wurde (der Eigenschaft wurde noch kein Wert zugewiesen).

Wenn Sie einen Dialog haben, der mehr als nur eine Frage ist, die der Benutzer beantworten sollte (z.Ein Eintragsformular), mit OK/Cancel sind Sie normalerweise besser dran, so dass Sie keine weiteren Werte benötigen.

+0

Dann warum Nullable (Of Boolean), warum nicht nur Boolean oder ThreeState? – Shimmy

+0

bool? ist meiner Meinung nach einfacher zu handhaben als yaetr (noch eine weitere Erinnerung). Und der Nullwert kann für Bindungen als ein nicht zugewiesener Wert im Gegensatz zu bestimmten wahren/falschen Werten nützlich sein. Natürlich, * ich weiß nicht * warum es so ist, nur raten :) – OregonGhost

2

Nach the MSDN documentation:

Dialogresult ist null, wenn das Dialog Feld angezeigt wird, aber weder akzeptiert noch abgebrochen.

Aber ich bin nicht sicher, wie das passieren könnte, wenn Sie mit mehreren Threads auf den Dialog zugreifen.

Die Dokumentation sagt, ist falsch, wenn eine der folgenden Dinge passieren:

  • PressesALT + F4.
  • Klicken Sie auf die Schaltfläche Schließen.
  • Wählt Schließen aus dem Systemmenü.
+0

Ich denke, es passiert, wenn der Benutzer auf die Schaltfläche Schließen oben rechts im Fenster klickt. –

+0

nicht gemäß der Dokumentation, die ich verlinkt ... ich werde mit mehr Details bearbeiten –

+0

@Max, wenn Sie 'Show' aufrufen, dann kehrt der Anruf zu Ihnen zurück (dh, es ist ein nicht blockierender Anruf), also bist du frei, den 'DialogResult'-Wert sofort abzufragen. Nur wenn Sie 'ShowDialog' aufrufen, blockiert der Aufruf, bis der Dialog beendet wird. Im letzteren Fall steht es Ihnen jedoch frei, das Objekt von einem anderen Thread abzufragen, wie Sie darauf hinweisen. –

14

Die DialogResult Eigenschaft ist auf der Window-Klasse definiert. Nicht alle Window s sind Dialoge. Daher ist die Eigenschaft nicht für alle Fenster relevant. Eine Window, die über Show() anstelle von ShowDialog() gezeigt wurde (vermutlich, sofern Sie es aus irgendeinem Grund nicht setzen) haben DialogResult = null.

Hier ist ein einfaches Beispiel zu demonstrieren:

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

Wenn Sie die Fenster zu schließen, Sie werde feststellen, dass der Dialog eine DialogResult von false hat, während die Non-Dialog hat eine null DialogResult.

+0

Während dies richtig und wahrscheinlich relevant ist, gab es bereits einen 'None'-Wert in der DialogResult-Enumeration, der den Zweck von null in diesem Beispiel ziemlich komfortabel erfüllt hätte. Ich bezweifle daher, dass der Wunsch, einen Nullwert zu haben, Grund genug wäre, vom etablierten Modell abzuweichen. –

+1

Für mich bedeutet null völlig irrelevant, während None darauf hinweist, dass es relevant, aber noch nicht gesetzt ist. * zuckt mit den Schultern * Semantik. –

+0

Lustigerweise würde ich es andersherum lesen. Null ist ein nicht definierter Wert und None bedeutet, dass es kein DialogResult gibt und auch nicht. Vielleicht war diese Art von Verwirrung Grund genug, das Modell zu ändern. –

0

ShowDialog wird immer wahr oder falsch zurückgeben. DialogResult wird nur den Nullstatus annehmen, wenn das Dialogfeld geöffnet ist. Wenn Sie von null auf true oder false umschalten, wird der Dialog geschlossen und der ursprüngliche Aufruf von ShowDialog wird zurückgegeben.

0

IMO, weil DialogResult nicht immer verwendet wird. Sie sehen, dass Sie DialogResult nur festlegen können, wenn das Fenster mit seiner ShowDialog() -Methode aufgerufen wird. Wenn Sie es mit seiner Show() -Methode aufrufen und versuchen, DialogResult auf irgendwas zu setzen, wird eine InvalidOperationException ausgelöst. Ich denke, das ist der Grund dafür, dass es Nullable ist. Wenn Sie das Fenster mit der Show() -Methode aufrufen, ist es null, wenn Sie es mit ShowDialog() aufrufen, liegt es an Ihnen.

+0

Hmm diese Antwort wurde schon von Kent Boogaart erzählt, Entschuldigung für das Umschreiben! – Carlo

Verwandte Themen