Notifica quando si chiude l’interfaccia utente WPF

Sto aprendo una finestra WPF da un’app per i vassoi. Io uso il seguente codice per aprire la finestra:

if (gui == null) { gui = new App(); gui.MainWindow = new mainWindow(); gui.InitializeComponent(); IsUIOpen = true; } else if (!IsUIOpen) { gui.InitializeComponent(); gui.MainWindow.Show(); gui.MainWindow = new mainWindow(); IsUIOpen = true; } 

Devo eseguire l’interfaccia utente dal livello dell’app perché utilizza un dizionario delle risorse. Il problema è che ho bisogno di eseguire il codice quando la finestra viene chiusa dall’utente, ma nessuno dei gestori di eventi sembra che mi stia segnalando.

Ho provato il seguente:

 gui.Exit += new System.Windows.ExitEventHandler(settings_FormClosed); gui.MainWindow.Closed += new EventHandler(settings_FormClosed); 

Ho anche provato gui.Deactivated , gui.SessionEnding , gui.MainWindow.Closing , gui.MainWindow.Deactivated e probabilmente alcuni altri.

Quando l’utente chiude la finestra, questo codice viene chiamato da Shell.xaml:

  private void Cancel_Click(object sender, RoutedEventArgs e) { presenter.Close(); this.Close(); } 

Mi rendo conto che App è statica, quindi non si chiuderà mai, ma uno di questi gestori di eventi dovrebbe collegarmi a un evento di chiusura.

Nel caso sia utile, il stream è il seguente: TrayApp.cs -> App.xaml -> Shell.xaml

Tutti i suggerimenti sarebbero apprezzati. Grazie in anticipo.

Dovresti provare l’evento di chiusura . Questo articolo fornisce informazioni utili su quando un WPF sta effettivamente chiudendo (non solo sulla finestra).

Josh è stato in grado di dare la soluzione corretta. Puoi vedere la sua risposta qui .

Fondamentalmente, avevo bisogno di avviare WPF come processo separato e quindi utilizzare la chiamata MyProcess.WaitForEnd (). Ho aggiunto questo a un thread in modo da non bloccare il vassoio. Il codice è il seguente:

 Process myProcess = new Process(); myProcess.StartInfo.UseShellExecute = false; myProcess.StartInfo.FileName = "C:\\mysettingsapp\\mysettingsapp.exe"; // replace with path to your settings app myProcess.StartInfo.CreateNoWindow = false; myProcess.Start(); // the process is started, now wait for it to finish myProcess.WaitForExit(); // use WaitForExit(int) to establish a timeout