2009-02-20 2 views
41

Ich habe ein WPF-Fenster, das ich aus einem anderen Fenster erzeuge, show() ing, und lasse es dann() selbst schließen. Wenn das Fenster geschlossen wird, erwarte ich, dass es stirbt, rufen Sie seinen Konstruktor auf und löschen Sie alle untergeordneten Elemente (wie Timer usw.).Was ist der richtige Weg, um ein WPF-Fenster zu entfernen?

Was ist der richtige Weg, um eine solche Aktion aufzurufen?

Antwort

52

Close() gibt alle nicht verwalteten Ressourcen frei und schließt alle im Besitz befindlichen Window s.

Alle anderen verwalteten Ressourcen, für die eine deterministische Entsorgung erforderlich ist, sollten vom Closed Ereignis behandelt werden.

Reference

(Anmerkung: entfällt vorherige Antwort, es eine völlig falsche Vermutung war)

+1

Die Window-Klasse in WPF hat keine Dispose() -Methode! –

+6

Vielleicht sollte ich zuerst die Dokumente lesen? –

11

Es gibt sehr wenige WPF-Elemente, die tatsächlich benötigen explizit entsorgt werden, anders als in Windows Forms.

Im Fall von Window genügt der Aufruf von Close(), um alle verwalteten und nicht verwalteten Ressourcen gemäß documentation zu entsorgen.

+3

Meine Dokumente sagen, dass nur nicht verwaltete Ressourcen entsorgt werden ... –

1

Schließen Sie das Fenster, und seien Sie zuversichtlich, dass Sie alle Ressourcen und alle untergeordneten Elemente freigegeben haben, damit alle Elemente mit gutem Verhalten im Logikbaum als Garbage Collected erfasst werden.

Ich sage "gut erzogen", weil es theoretisch möglich ist, ein Element zu haben, das etwas wie ein Thread erstellt, der nicht ordnungsgemäß gestoppt wird, aber in der Praxis, wenn Sie das grundlegende WPF-Framework und gut geschriebene Steuerelemente verwenden sollte in Ordnung sein, um einfach alles zu veröffentlichen.

6

Nur für den Fall, ich werde meine zwei Cent hinzufügen.

Mein Problem war, dass ich nicht genug Fehlersuche gemacht habe. Mein Fenster ein untergeordnetes Fenster war, die geöffnet werden konnten, geschlossen und wieder geöffnet, so fügte ich die folgenden, damit er nicht vollständig schließt:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { 
    e.Cancel = true; 
    this.Hide(); 
} 

Wenn jedoch Window.Close genannt wurde, es verbarg nur die Fenster. Ich fing schließlich an und fügte hinzu, die folgenden:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { 
    e.Cancel = true; 
    this.Hide(); 
} 

public void Close() { 
    this.Closing -= Window_Closing; 
    //Add closing logic here. 
    base.Close(); 
} 

Dies funktioniert gut - es entfernt die Event-Handler aus dem Fenster aus geschlossen ist, zu verhindern und schließt sie dann.

+0

Hah, ich habe genau den gleichen Fehler (habe vergessen, den Ereignishandler zu beenden), wenn ich versuche, ein untergeordnetes Fenster zu schließen. Habe meinen Tag gerettet :) – Nipheris

Verwandte Themen