Pregunta

¿Puede alguien pensar en una buena explicación para el hecho de que resultado de un diálogo es un bool anulable en WPF? Esto siempre me ha desconcertado. En WinForms que era un tipo de enumeración y que tenía mucho más sentido para mí.

¿Fue útil?

Solución

En mi opinión, esto se hizo porque en la mayoría de los casos no es necesario los generalizadas especializado como opciones de reintento o ignorar.

Si necesita más de OK / Cancelar, se supone que utilizar algún tipo de diálogo de tareas, por ejemplo, con respuestas escritas de salida. De esta manera, usted no está limitado a los pocos valores de enumeración alguien se le ocurrió hace algunas décadas, y el DialogResult es sólo positivo / negativo para el uso básico y se puede poner en práctica su propia propiedad que es específico para sus necesidades avanzadas. Por tanto, sólo verdadero / falso se necesita, y nula que indica que la ventana no se ha cerrado todavía (sin valor ha sido asignado a la propiedad todavía).

Si usted tiene un cuadro de diálogo que es algo más que una pregunta que el usuario debe responder (por ejemplo, un formulario de inscripción), que está normalmente mejor con Aceptar / Cancelar, por lo que no necesita más valores.

Otros consejos

La propiedad DialogResult se define en la clase Window. No todos los Windows son diálogos. Por lo tanto, la propiedad no es relevante para todas las ventanas. Un Window que se ha demostrado a través de Show() en lugar de ShowDialog() voluntad (presumiblemente, a menos que establezca que, por alguna razón) tienen DialogResult = null.

Aquí está un ejemplo sencillo para demostrar lo siguiente:

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

Al cerrar las ventanas, se dará cuenta de que el diálogo tiene un DialogResult de false, mientras que el diálogo no tiene una null DialogResult.

De acuerdo con la documentación de MSDN :

  

DialogResult es nula cuando el cuadro de diálogo   cuadro se muestra, pero aceptada ni   cancelado.

Pero no estoy seguro de cómo podría suceder a menos que usted está tratando con múltiples hilos para acceder a la ventana de diálogo.

La documentación dice es falso cuando una de las siguientes cosas:

  
      
  • PressesALT + F4.
  •   
  • hace clic en el botón Cerrar.
  •   
  • Selecciona Cerrar en el menú del sistema.
  •   

ShowDialog siempre devolverá verdadero o falso. DialogResult sólo tendrá el estado nulo cuando el diálogo está abierto. La transición de cero a verdadero o falso se cerrará el cuadro de diálogo y hacer la llamada original para volver ShowDialog.

OMI esto se debe a DialogResult no se utiliza siempre. Usted ve, sólo se puede establecer DialogResult si la ventana se llama por su método ShowDialog (), si usted lo llama con su método Show (), y tratar de establecer DialogResult a nada, que va a lanzar una excepción InvalidOperationException. Así que creo que es la razón por la que es anulable, en caso de que se llama a la ventana con el método Show (), que va a ser nulo, si se llama usando ShowDialog (), que depende de usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top