Come posso uscire da un'applicazione WPF a livello di codice?


478

In pochi anni ho usato C # (Windows Forms), non ho mai usato WPF. Ma ora adoro WPF, ma non so come dovrei uscire dalla mia applicazione quando l'utente fa clic sulla voce di menu Esci dal menu File.

Ho provato:

this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();

Tra molti altri. Niente funziona.

Risposte:


781

Per uscire dall'applicazione è possibile chiamare

System.Windows.Application.Current.Shutdown();

Come descritto nella documentazione del Application.Shutdownmetodo, è anche possibile modificare il comportamento di arresto dell'applicazione specificando un ShutdownMode :

L'arresto viene chiamato implicitamente da Windows Presentation Foundation (WPF) nelle seguenti situazioni:

  • Quando ShutdownMode è impostato su OnLastWindowClose.
  • Quando ShutdownMode è impostato su OnMainWindowClose.
  • Quando un utente termina una sessione e l'evento SessionEnding non viene gestito o gestito senza annullamento.

Si noti inoltre che Application.Current.Shutdown();può essere chiamato solo dal thread che ha creato l' Applicationoggetto, ovvero normalmente il thread principale.


8
Come ho sottolineato, non è strano. In WPF Application è una classe statica. Application.Current è un riferimento all'applicazione attualmente in esecuzione.
TimothyP,

4
Secondo me, è un po 'strano nel senso che questo non è ovvio a prima vista, e si discosta dai modelli del passato per scacciare le persone. Ha perfettamente senso che funzioni ovviamente.
Brian MacKay,

20
Se chiami la Application.Current.Shutdown();tua funzione non tornerà immediatamente. È necessario chiamare return;anche per questo.
Erwin Mayer,

2
Ho usato questo dove da una finestra pop-up un'altra finestra e, nell'evento window_closed di quella finestra ho aggiunto questo codice. tutte le finestre scompaiono, ma il programma funziona ancora oltre il punto in cui viene creato il pop-up.
Diyoda_

7
@TimothyP No ApplicationNON è una classe statica. Avere un Application.Currentmembro statico non significa che sia statico. Invece, è una classe normale che può essere derivata.
Earth Engine,

156

Se ne hai davvero bisogno per chiudere puoi anche usare Environment.Exit () , ma non è affatto grazioso (più come terminare il processo).

Usalo come segue:

Environment.Exit(0)

4
Environment.Exit()necessita di almeno un parametro, un codice di uscita. Utilizzare Environment.Exit(0)se non si è preoccupati per il codice di uscita.
gbmhunter,

24
Questo metodo in realtà ha chiuso tutto. La mia app stava lasciando qualcosa in esecuzione (il modulo stava chiudendo, ma era ancora in corso un processo) conApplication.Current.Shutdown();
gbmhunter

4
Environment.Exit è sicuramente il modo giusto per garantire l'arresto di un'applicazione. Con Application.Current.Shutdown puoi facilmente finire con l'applicazione in esecuzione indefinitamente se hai un codice che si reinserisce nel dispatcher.
Marcus Andrén,

Uguale a Application.exit (0);
Sayka,

Con il Application.Current.Shutdown();mio Closingevento è stato chiamato, quando volevo semplicemente chiudere immediatamente la mia app. Quindi è Environment.Exit(0);stata la scelta migliore.
FredM,

64

Come ha detto wuminqi , Application.Current.Shutdown();è irreversibile e credo che sia in genere utilizzato per forzare la chiusura di un'applicazione in momenti come quando un utente si disconnette o chiude Windows.

Invece, chiama this.close()nella finestra principale. Ciò equivale a premere Alt+ F4o il pulsante di chiusura [x] sulla finestra. Ciò causerà la chiusura di tutte le altre finestre di proprietà e terminerà la chiamata Application.Current.Shutdown();fino a quando l'azione di chiusura non verrà annullata. Consultare la documentazione MSDN su Chiusura di una finestra .

Anche perchè this.close() è cancellabile, è possibile inserire una finestra di dialogo di conferma delle modifiche nel gestore eventi di chiusura. È sufficiente creare un gestore eventi <Window Closing="...">e modificarlo di e.Cancelconseguenza. (Vedi la documentazione MSDN per maggiori dettagli su come farlo.)


2
+1 Ho deciso di andare con questo, soprattutto perché ho bisogno di salvare i file aperti prima di chiudere effettivamente l'applicazione.
AgentKnopf,

2
Una cosa importante da notare qui è il fatto che Allen ha sottolineato un fatto molto importante: tutte le altre finestre di proprietà verranno chiuse. Devi assicurarti di dichiarare la proprietà. Se hai una finestra in esecuzione e quindi apri un'altra finestra ma non la mostri ancora, dopo aver chiuso la finestra attiva, la finestra nascosta forzerà l'applicazione a continuare a funzionare. Avrai una potenziale perdita di memoria a meno che non chiudi quella finestra con altri mezzi (task manager, ecc.). Ho provato questo.
BK

35

Utilizzare uno dei seguenti come necessario:

1.

 App.Current.Shutdown();
OR
 Application.Current.Shutdown();

2.

 App.Current.MainWindow.Close();
OR
 Application.Current.MainWindow.Close();

Soprattutto i metodi chiameranno closing eventdi Windowclasse e l'esecuzione potrebbe interrompersi ad un certo punto (perché di solito le applicazioni inseriscono dialoghi come 'ne sei sicuro?' O ' Vuoi salvare i dati prima di chiudere? ', Prima che una finestra venga chiusa completamente)

3. Ma se si desidera terminare l'applicazione senza alcun avviso immediatamente. Usa sotto

   Environment.Exit(0);


18

Ecco come faccio il mio:

// Any control that causes the Window.Closing even to trigger.
private void MenuItemExit_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}

// Method to handle the Window.Closing event.
private void Window_Closing(object sender, CancelEventArgs e)
{
    var response = MessageBox.Show("Do you really want to exit?", "Exiting...",
                                   MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
    if (response == MessageBoxResult.No)
    {
        e.Cancel = true;
    }
    else
    {
        Application.Current.Shutdown();
    }
}

Chiedo solo Application.Current.ShutDown()dalla finestra principale dell'applicazione, tutte le altre finestre usanothis.Close() . Nella mia finestra principale, Window_Closing(...)gestisce il xpulsante in alto a destra . Se uno dei metodi richiede la chiusura della finestra, Window_Closing(...)cattura l'evento per chiudere se l'utente conferma.

La ragione per cui lo faccio, infatti Application.Current.Shutdown() nella mia finestra principale è che ho notato che se si è verificato un errore di progettazione e non ho dichiarato un genitore di una delle mie finestre in un'applicazione, se quella finestra viene aperta senza essere mostrata prima all'ultima chiusura attiva della finestra, mi rimane una finestra nascosta in esecuzione in background. L'applicazione non si chiuderà. L'unico modo per impedire la completa perdita di memoria è per me andare nel Task Manager per chiudere l'applicazione. Application.Current.Shutdown()mi protegge da difetti di progettazione involontari.

Questo proviene dalla mia esperienza personale. Alla fine, usa ciò che è meglio per il tuo scenario. Questa è solo un'altra informazione.


16

Non ci dovrebbe essere un messaggio Application.ShutDown();o .Exit().

Applicationè una classe statica. Non si riferisce all'applicazione corrente. Devi arrivare all'applicazione corrente e quindi spegnerla in questo modo:

Application.Current.Shutdown();

8

Un altro modo per farlo:

System.Diagnostics.Process.GetCurrentProcess().Kill();

Questo forzerà l'uccisione della tua applicazione. Funziona sempre, anche in un'applicazione multi-thread.

Nota: fai solo attenzione a non perdere i dati non salvati in un altro thread.


Questo sembra incomprensibile: "in process funziona sempre" . Puoi aggiustarlo? O almeno spiegare qui nei commenti cosa intendi?
Peter Mortensen,

Anche questo è parzialmente incomprensibile: preoccupati solo di un'applicazione che ha salvato i dati in file da un altro thread. Puoi aggiustarlo? O almeno spiegare qui nei commenti cosa intendi?
Peter Mortensen,

Stai usando Google Translate?
Peter Mortensen,

no, la mia media è quando l'applicazione è in esecuzione come multi thread e si utilizza Process.Kill funzionerà, ma in un altro modo come questo. chiudere non funziona in applicazioni multithread quando è in esecuzione un altro thread.
Ali Yousefi,

6
private void _MenuExit_Click(object sender, RoutedEventArgs e)
{
   System.Windows.Application.Current.MainWindow.Close();
}

//Override the onClose method in the Application Main window

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    MessageBoxResult result =   MessageBox.Show("Do you really want to close", "",
                                          MessageBoxButton.OKCancel);
    if (result == MessageBoxResult.Cancel)
    {
       e.Cancel = true;
    }
    base.OnClosing(e);
}

questa non è la risposta alla domanda che vuole solo sapere come uscire dall'applicazione wpf.
Mehdi

6

Provare

App.Current.Shutdown();

Per me

Application.Current.Shutdown(); 

non ha funzionato.


6

Secondo la mia comprensione, Application.Current.Shutdown()ha anche il suo svantaggio.

Se si desidera mostrare una finestra di conferma per consentire agli utenti di confermare all'uscita o meno, Application.Current.Shutdown()è irreversibile.


7
Non lo capisco Tuttavia, possiamo ottenere la conferma dell'utente prima di chiamare Application.Current.Shutdown().
Amsakanna,

2
Non vedo perché dovresti confermare. Troppe conferme sono una brutta cosa. Il fatto che qualcuno abbia fatto lo sforzo di fare clic per aprire il menu File, spostarsi fino in fondo al menu File e quindi fare clic su Esci, è praticamente confermato che non desiderano più utilizzare l'applicazione.

Veer: Nel mio caso, viene visualizzata la finestra di conferma, ma anche quando si sceglie "annulla" nella conferma, l'APP principale viene chiusa.
Wuminqi,

7
JTS: è meglio progettarlo caso per caso. La nostra app, se ci sono lavori in esecuzione, l'uscita forzata causerà danni, quindi è meglio lasciarli informati nella finestra di dialogo di conferma
wuminqi

3

Riassumendo, ci sono alcuni modi per farlo.

1) Killing the process, che salta la finalizzazione, la gestione degli errori ecc .:

Process.GetCurrentProcess().Kill();

2) Chiudere l'applicazione corrente, che è probabilmente il modo corretto perché chiama gli eventi di uscita:

Application.Current.Shutdown();

o

this.Shutdown();

(quando clled in un'istanza di classe App)

3) Chiusura dell'app corrente (tutti i moduli devono essere chiusi / completati in precedenza):

this.Close(); 

(quando clled in un'istanza di classe App)

4) Uscita dall'ambiente, che termina l'app:

Environment.Exit(0);

Inoltre, potresti voler leggere qui le statistiche di uscita


2

Caliburn micro aromatizzato

public class CloseAppResult : CancelResult
{
    public override void Execute(CoroutineExecutionContext context)
    {
        Application.Current.Shutdown();
        base.Execute(context);
    }
}

public class CancelResult : Result
{
    public override void Execute(CoroutineExecutionContext context)
    {
        OnCompleted(this, new ResultCompletionEventArgs { WasCancelled = true });
    }
}

Che cosa significa "Caliburn micro flavoured" ?
Peter Mortensen,

Come lo otterresti usando Caliburn Micro
Anders

0

Se si desidera uscire da un altro thread che non ha creato l'oggetto applicazione, utilizzare:

System.Windows.Application.Current.Dispatcher.InvokeShutdown();

-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;


2
Benvenuti in SO, Alpha-LIon! Le risposte solo al codice sono sconsigliate qui, in quanto non forniscono informazioni su come il problema è stato risolto. Aggiorna la tua soluzione con una spiegazione di come il tuo codice risolve il problema del PO :)
Joel

-3

Dal codice xaml puoi chiamare un SystemCommand predefinito:

Command="SystemCommands.MinimizeWindowCommand"

Penso che questo dovrebbe essere il modo preferito ...


Riduci a icona! = Esci dall'applicazione. Non vedo un'opzione per l'app di uscita in quell'elenco. Sembra più gestione delle finestre e chiudere la finestra non significa necessariamente chiudere l'app. msdn.microsoft.com/en-us/library/…
kenny
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.