2009-06-13 10 views
25

El método Window.ShowDialog de WPF devuelve un valor booleano anulable. Lo mismo ocurre con CommonDialog.ShowDialog.¿Cuándo ShowDialog() devolverá nulo?

Ahora, entiendo casos en los que estos devolverían falso (el usuario hizo clic en Cancelar o presionó Esc), y cuándo devolverían verdadero (el código establece Window.DialogResult en verdadero, probablemente en respuesta a que se haga clic en Aceptar). Pero nulo?

Lo primero que pensé es que al hacer clic en el botón Cerrar de la barra de título, puede que se devuelva nulo. Pero el estado de los documentos (y confirmé mediante pruebas) que the title-bar Close button is treated as a Cancel.

Entonces, ¿cuándo Window.ShowDialog o volverán alguna vez a cero?

+0

Tienes que amar la documentación de MS. "A Nullable <(Of <(T>)>) valor de tipo Booleano que indica cómo el usuario cerró una ventana". Gee, eso ayuda. –

+0

Suena como el tipo de documentación donde a los escritores no se les permitió hablar con los desarrolladores y hacer preguntas, pero solo se les permitió acceder a lo que tenían en la pantalla ... – SqlRyan

Respuesta

17

El método siempre devuelve verdadero o falso, y esto siempre es igual a la propiedad DialogResult de la ventana en el momento en que se cierra.

Pero la propiedad DialogResult es nula antes de que se cierre la ventana, y otro hilo podría verificar la propiedad. Por lo tanto, tiene sentido que el valor de retorno sea un booleano anulable para que coincida con la propiedad, aunque en realidad nunca es nulo.

+0

No estoy seguro de dónde se puede tener la idea de que otro hilo podría marca DialogResult. Si lo intenta, obtiene una InvalidOperationException ("El hilo de llamada no puede acceder a este objeto porque lo posee un hilo diferente") –

+5

No es otro hilo, pero cualquier código que se ejecute (por ejemplo) en un controlador de eventos en el diálogo podría recuperar el valor de DialogResult antes de que se complete. Personalmente, creo que es una mala elección de diseño. Debería haber sido no anulable, el getter arrojando una excepción si se accede antes de que el diálogo se cierre. –

2

Si devuelvo DialogResult = null en el evento Click para un botón, la ventana permanece abierta.

private void OkButton_Click(object sender, RoutedEventArgs e) 
{ 
    Button btn = sender as Button; 
    if (btn != null) 
    { 
     // forces all control to update... 
     btn.Focus(); 
    } 

    // TEST IF OK TO CLOSE 
    bool rc = _vm.ProcessOkCommand(); 
    if (rc) 
    { 
     DialogResult = true; 
    } 
    else 
    { 
     DialogResult = null; 
    } 
} 


<Button Content="OK" Name ="cmdOK" IsDefault="True" Click="OkButton_Click"/> 
+0

Correcto, ese es mi punto: parece que ShowDialog nunca devolverá nulo. –

+0

No es mejor que no hacer nada que establecer 'DialogResult = null;'. Efectivamente, ambos son lo mismo, supongo. Corrígeme si estoy equivocado. –

Cuestiones relacionadas