2012-04-12 12 views
8

Si el usuario cierra la aplicación, se debe mostrar un archivo de guardar-mensaje (para asegurarse de que desea descartar los cambios de los archivos editados).ShowDialog en el evento de cierre

Para implementar esto, tengo un elemento de menú con un comando de unión (sin clave en gestos):

private void Command_Exit(object sender, ExecutedRoutedEventArgs e) 
{ 
    Application.Current.Shutdown(); 
} 

la MainWindow tiene un cierre del evento. en este caso, verifico si hay archivos no guardados. En caso afirmativo, el SaveDialog tiene que ser abierto (a elegir, qué archivos tienen que ser guardado):

private void Window_Closing(object sender, CancelEventArgs e) 
    { 
     if (sdl.Count() > 0) 
     { 
      SaveDialog sd = new SaveDialog(); 
      IEnumerable<Doc> close = sd.ShowDialog(this); 
      if (close == null) 
       e.Cancel = true; 
      else 
       foreach (Doc document in close) 
        document.Save(); 
     } 

    } 

en este ShowDialog-Método (implementado en mi SaveDialog-Class) que llamo

bool? ret = ShowDialog(); 
if (!ret.HasValue) 
    return null; 
if (!ret.Value) 
    return null; 

El problema es:

Si uso el atajo Alt + F4 para cerrar la aplicación (comportamiento predeterminado de la ventana principal) funciona y obtengo el archivo de registro de guardado si hay archivos no guardados. pero si cierro la aplicación mediante la ejecución del Command_Exit-método, el método Call-

bool? ret = ShowDialog(); 

vuelve nula y no aparece el cuadro de diálogo.

Si asigno Alt + F4 KeyGesture a CommandBinding, el problema se cambia: Ejecutar Command_Exit funciona bien pero Alt + F4 Shortcut not.

¿Cuál es la razón por la que el método ShowDialog() funciona no en ambos casos y cómo solucionarlo?

+0

¿De qué maneras se puede cerrar una ventana? No solo interactivamente – Jodrell

Respuesta

6

La ruta Application.Current.Shutdown le permite escuchar a la solicitud de cierre por controlar el evento de salida como se detalla aquí:

http://msdn.microsoft.com/en-us/library/ms597013.aspx

No detalle la forma en que se cierra las ventanas, por lo que no sería necesariamente Convencido de que el controlador de eventos de cierre se activará antes de que cierre la aplicación.

La otra manera muy estándar de cerrar la aplicación es cerrar la ventana principal (la que se muestra al principio). Probablemente sea el método Window.Close, si ya se encuentra en el contexto de la ventana, simplemente llame al Close(). Esto golpeará el controlador de evento de cierre.

+0

aah, por supuesto, ¿por qué no he pensado en simplemente llamar Cerrar()? Gracias, Problema resuelto – 0xDEADBEEF

+0

Cerrar es la forma estándar.Cuando el formulario principal se cierra, el código progresará naturalmente al punto de entrada donde saldrá. El funcionamiento interno de WPF cerrará las partes restantes de la aplicación. –

3

Su implementación Command_Exit es incorrecta. Application.Current.Shutdown() significa que la aplicación ya se está cerrando, lo que puede impedir que se abran los cuadros de diálogo.

Debe implementar el comando de otra forma: en el comando debe preguntar a su lógica de negocios si es seguro que se cierre, y emita Application.Current.Shutdown() solo en ese caso. De lo contrario, debe pedirle a la lógica comercial que inicie la secuencia de apagado, que a su vez guardará los archivos abiertos, y emita un Shutdown al completar las operaciones de guardado.

Además, debe desencadenar la misma rutina cuando el usuario intenta cerrar la ventana principal (es decir, en su Window.Closing).

Cuestiones relacionadas