2013-10-04 4 views
6

Ich habe eine kleine App mit mehreren Formularen, von denen jedes ihr Fensterlayout während des FormClosing-Ereignisses speichert.Wie fange ich FormClosing für eierlose Formulare am roten X-Ausgang ab?

Einige Formulare müssen auf dem Bildschirm angezeigt werden, wenn das Hauptformular minimiert wird, so dass sie ohne Besitzer mit form.Show() geöffnet werden, im Gegensatz zu form.Show(this).

Allerdings wirkt sich dies auf FormClosing Verhalten aus - wenn der Benutzer mit dem roten X beendet wird, wird das Ereignis FormClosing nicht für die Formulare ohne Besitzer ausgelöst.

Application.Exit() ist je nach Bedarf arbeiten, aber das FormClosing Ereignis in der Hauptform Cancelling und ruft Application.Exit() statt verursacht FormClosing zweimal auf alles, als die herrenlos anderen Formen genannt werden.

Ich könnte wahrscheinlich OpenForms im FormClosing-Ereignis des Hauptformulars iterieren und alles speichern, was gespeichert werden muss, aber das scheint ein bisschen wie ein Hack. Gibt es eine Möglichkeit, X so zu verhalten wie Application.Exit()?

Der folgende Code demonstriert das Problem:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     this.Text = "Main"; 

     Form ownedForm = new Form { Text = "Owned" }; 
     ownedForm.FormClosing += (s, e) => { System.Diagnostics.Debug.WriteLine("FormClosing owned form"); }; 
     ownedForm.Show(this); 

     Form ownerlessForm = new Form { Text = "Ownerless" }; 
     ownerlessForm.FormClosing += (s, e) => { System.Diagnostics.Debug.WriteLine("FormClosing ownerless form"); }; 
     ownerlessForm.Show(); 

     this.FormClosing += (s, e) => 
     { 
      System.Diagnostics.Debug.WriteLine("FormClosing main form"); 

      // fix below doesn't work as needed! 
      //if (e.CloseReason == CloseReason.UserClosing) 
      //{ 
      // e.Cancel = true; 
      // Application.Exit(); 
      //} 
     }; 
    } 
} 

Antwort

3

FormClosing Handler einen Ereignishandler das Hauptformular Fügen Sie die herrenlos Formen zu schließen, wenn das Hauptformular geschlossen ist:

ownerlessForm.Show(); //right after this line that you already have 
FormClosing += (s, e) => ownerlessForm.Close(); //add this 

Dadurch wird sichergestellt, dass sie elegant geschlossen sind und ihre Abschluss-Events laufen, anstatt dass der Haupt-Thread endet und der Prozess abgebrochen werden muss, ohne dass diese Formulare sich elegant schließen.

+0

Große Antwort, danke - alles wird viel klarer zu wissen, dass rote X Ausfahrt ist effektiv eine Kraft-beenden für die herrenlosen Formen. – jlmt

+0

@jlmt Nun, effektiver schließen das Hauptformular bedeutet, dass die Nachrichtenschleife der Anwendung endet, und wenn dies endet, endet die 'Main'-Methode, und wenn das endet, endet der letzte verbleibende Vordergrund Thread. Wenn das passiert, wird der gesamte Prozess abgebrochen. Das Problem ist, dass zu keinem Zeitpunkt eine enge Nachricht an die anderen Formulare gesendet wird. Dieser Code ändert das. – Servy

Verwandte Themen