2012-04-12 16 views
8

Se l'utente chiude l'applicazione, è necessario visualizzare un messaggio di salvataggio (per essere sicuri di voler eliminare le modifiche dei file modificati).ShowDialog in Closing-Event

per implementare questo, ho un menuitem con un comando poroso (senza chiave-gesto):

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

MainWindow ha una chiusura evento. in questo caso controllo se ci sono file non salvati. se sì, la SaveDialog deve essere aperto (da scegliere, quali file devono essere salvati):

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

    } 

in questo ShowDialog-Method (implementato nel mio SaveDialog-Class) che io chiamo

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

Il problema è:

Se uso Alt + F4-Shortcut per chiudere l'applicazione (comportamento predefinito della finestra principale) funziona e ottengo il file salvato se ci sono file non salvati. ma se chiudo l'applicazione eseguendo il Command_Exit-metodo, il metodo-Call

bool? ret = ShowDialog(); 

restituisce NULL e non viene visualizzata la finestra di dialogo.

Se assegno Alt + F4 KeyGesture a CommandBinding, il problema è cambiato: Esecuzione Command_Exit funziona bene ma Alt + F4 Collegamento no.

Qual è il motivo per cui ShowDialog() - Method non funziona in entrambi i casi e come risolverlo?

+0

In che modo una finestra può essere chiusa? Non solo in modo interattivo. – Jodrell

risposta

6

Il percorso Application.Current.Shutdown consente di ascoltare la richiesta di arresto gestendo l'evento Exit come dettagliato qui:

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

Non dettaglio come chiude le finestre, quindi non sarebbe necessariamente convinto che il gestore dell'evento di chiusura avrebbe sparato prima che chiudesse l'applicazione.

L'altro modo molto standard per chiudere l'applicazione è chiudere la finestra principale (quella mostrata all'inizio). Questo sarebbe probabilmente il metodo Window.Close, se sei già nel contesto della finestra, chiama semplicemente Close(). Questo colpirà quindi il gestore dell'evento di chiusura.

+0

aah, naturalmente, perché non ci ho pensato su semplicemente chiamare Close()? Grazie, Problema risolto – 0xDEADBEEF

+0

Chiudi è il modo standard.Quando il modulo principale si chiude, il codice procederà naturalmente fino al punto di ingresso in cui uscirà. I meccanismi interni di WPF interromperanno quindi tutte le parti rimanenti dell'app. –

3

L'implementazione Command_Exit è errata. Application.Current.Shutdown() significa che l'applicazione è già in fase di arresto, il che può impedire l'apertura delle finestre di dialogo.

È necessario implementare il comando in un altro modo: nel comando è necessario chiedere la logica di business se è sicuro per lo spegnimento e emettere Application.Current.Shutdown() solo in quel caso. In caso contrario, è necessario chiedere alla business logic di avviare la sequenza di spegnimento, che a sua volta salverà i file aperti e emetterà un Shutdown al termine delle operazioni di salvataggio.

Inoltre, è necessario attivare la stessa routine quando l'utente tenta di chiudere la finestra principale (ovvero, sul suo Window.Closing).

Problemi correlati