.net - true - public bool c# para que sirve
¿Por qué DialogResult es un bool que admite nulos en WPF? (5)
En mi opinión, esto se hizo porque en la mayoría de los casos no necesita las opciones especializadas generalizadas como Reintentar o Ignorar.
Si necesita más que Aceptar / Cancelar, se supone que debe utilizar algún tipo de diálogo de tarea, por ejemplo, con respuestas escritas. De esa manera, no está limitado a los pocos valores enumerables que alguien pensó hace algunas décadas, y DialogResult es solo positivo / negativo para uso básico y puede implementar su propia propiedad que sea específica para sus necesidades avanzadas. Por lo tanto, solo se necesita verdadero / falso, y nulo indica que la ventana aún no se ha cerrado (aún no se ha asignado ningún valor a la propiedad).
Si tiene un cuadro de diálogo que es más que solo una pregunta que el usuario debería responder (por ejemplo, un formulario de entrada), normalmente estará mejor con Aceptar / Cancelar, por lo que no necesita más valores.
¿Alguien puede pensar en una buena explicación para el hecho de que el resultado de un diálogo es un bool nulable en WPF? Esto siempre me ha desconcertado. En WinForms era un tipo de enumeración y eso tenía mucho más sentido para mí.
OMI, esto se debe a que DialogResult no siempre se utiliza. Verá, solo puede establecer DialogResult si la ventana se llama mediante su método ShowDialog (), si la llama con su método Show (), e intenta configurar DialogResult a cualquier cosa, lanzará una excepción InvalidOperationException. Así que creo que esa es la razón por la que es anulable, en caso de que llame a la ventana con el método Show (), será nulo; si lo llama con ShowDialog (), depende de usted.
Según la documentación de MSDN :
DialogResult es nulo cuando se muestra el cuadro de diálogo pero no se acepta ni se cancela.
Pero no estoy seguro de cómo podría suceder eso a menos que esté tratando con varios subprocesos que acceden al diálogo.
La documentación dice que es falsa cuando ocurre una de las siguientes cosas:
- Presiona ALT + F4.
- Haga clic en el botón Cerrar.
- Selecciona Cerrar en el menú Sistema.
ShowDialog siempre devolverá verdadero o falso. DialogResult solo tomará el estado nulo cuando el diálogo esté abierto. La transición de nulo a verdadero o falso cerrará el cuadro de diálogo y hará que la llamada original a ShowDialog vuelva.
La propiedad DialogResult
se define en la clase Window
. No todas las Window
son diálogos. Por lo tanto, la propiedad no es relevante para todas las ventanas. Una Window
que se ha mostrado a través de Show()
lugar de ShowDialog()
tendrá (presumiblemente, a menos que lo establezca por alguna razón) tendrá DialogResult = null
.
Aquí hay un ejemplo simple para demostrar:
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);
}
}
}
Cuando cierre las ventanas, notará que el cuadro de diálogo tiene un DialogResult
de false
, mientras que el no-diálogo tiene un null DialogResult
.