Frage

Kann jemand eine gute Erklärung für die Tatsache vorstellen, dass das Ergebnis eines Dialogs in WPF ein nullbares Bool ist? Das hat mich immer verblüfft. In Winforms war es ein Enum -Typ und das machte mir viel sinnvoller.

War es hilfreich?

Lösung

Meiner Meinung nach wurde dies geschehen, weil Sie in den meisten Fällen die nicht brauchen verallgemeinerte spezialisierte Optionen wie erneut oder ignorieren.

Wenn Sie mehr als OK/Abbrechen benötigen, sollten Sie einen Dialogfeld "Aufgaben" verwenden, z. B. mit schriftlichen Antworten. Auf diese Weise beschränken Sie sich nicht auf die wenigen ENUM -Werte, an die jemand vor einigen Jahrzehnten gedacht hat, und die Dialogresult ist nur positiv/negativ für die grundlegende Verwendung und Sie können Ihre eigene Eigenschaft implementieren, die spezifisch für Ihre fortgeschrittenen Anforderungen ist. Daher ist nur True/False erforderlich, und Null zeigt an, 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. B. ein Anmeldeformular), sind Sie in der Regel besser mit OK/Abbrechen, sodass Sie nicht mehr Werte benötigen.

Andere Tipps

Das DialogResult Eigenschaft ist auf der definiert Window Klasse. Nicht alle Windows sind Dialoge. Daher ist die Eigenschaft für alle Fenster nicht relevant. EIN Window das wurde über durch gezeigt Show() statt ShowDialog() Will (vermutlich, es sei denn, Sie setzen es aus irgendeinem Grund) haben DialogResult = null.

Hier ist ein einfaches Beispiel zu demonstrieren:

Fenster1.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 schließen, werden Sie feststellen, dass der Dialog einen hat DialogResult von false, während der Nicht-Dialog a hat null DialogResult.

Entsprechend Die MSDN -Dokumentation:

Dialogresult ist null, wenn das Dialogfeld angezeigt wird, aber weder akzeptiert noch abgesagt wird.

Ich bin mir jedoch nicht sicher, wie das passieren könnte, wenn es sich nicht um mehrere Threads handelt, die auf den Dialog zugreifen.

Die Dokumentation besagt, dass dies falsch ist, wenn eines der folgenden Dinge passiert:

  • Presse+F4.
  • Klickt auf die Schaltfläche Schließen.
  • Wählt aus dem Systemmenü näher.

Showdialog wird immer wahr oder falsch zurückgeben. Dialogresult nimmt nur den Nullstatus an, wenn der Dialog geöffnet ist. Durch den Übergang von Null zu True oder False wird der Dialog geschlossen und den ursprünglichen Aufruf zur Rückgabe von Showdialog.

IMO Dies liegt daran, dass Dialogresult nicht immer verwendet wird. Sie sehen, Sie können nur Dialogresult einstellen, wenn das Fenster von seiner Messedialog () -Methode aufgerufen wird. Wenn Sie es mit seiner Show () -Methode aufrufen und versuchen, Dialogresult auf irgendetwas zu setzen, werfen Sie eine ungültige OperationException aus. Ich denke, das ist der Grund, warum es nullbar ist, falls Sie das Fenster mit der Show () -Methode aufrufen, es wird null sein. Wenn Sie es mit ShowDialog () nennen, liegt es an Ihnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top