2009-02-20 7 views
41

J'ai une fenêtre WPF que je crée à partir d'une autre fenêtre, show() ing, puis je la laisse close() elle-même. Lorsque la fenêtre se ferme, je m'attends à ce qu'il meure, appelle son constructeur et supprime tous ses éléments enfants (tels que les minuteurs ..).Quelle est la bonne façon de disposer d'une fenêtre WPF?

Quelle est la manière correcte d'invoquer une telle action?

Répondre

52

Close() libère toutes les ressources non managées et ferme toutes les propriétés Window s.

Toutes les autres ressources gérées dont vous avez besoin doivent être traitées à partir de l'événement Closed.

Reference

(Note: supprimé réponse précédente, il était une supposition tout à fait tort)

+1

La classe Window dans WPF n'a pas de méthode Dispose()! –

+6

Peut-être que je devrais lire les docs en premier? –

11

Il y a très peu d'éléments WPF qui doivent effectivement être éliminés de façon explicite, contrairement à Windows Forms.

Dans le cas de Windows, l'appel de Close() est suffisant pour disposer toutes les ressources gérées et non gérées en accord avec documentation.

+3

Mes docs disent que seules les ressources non gérées sont éliminées ... –

1

Si vous fermez la fenêtre et que vous êtes certain que vous avez libéré toutes les ressources sur cet élément et l'un de ses enfants, tous les éléments bien élevés de l'arborescence logique seront récupérés. Je dis bien "bien comporté" car il est théoriquement possible d'avoir un élément qui fait quelque chose comme créer un thread qui n'est pas arrêté correctement, mais en pratique si vous utilisez le framework WPF de base et des contrôles bien écrits, vous devrait être bien pour tout libérer.

6

Juste au cas, je vais ajouter mes deux cents.

Mon problème était que je n'ai pas fait assez de dépannage. Ma fenêtre était une fenêtre enfant qui pourrait être ouvert, fermé et a rouvert ses portes, donc j'ajouté ce qui suit pour l'empêcher de fermer complètement:

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

Cependant, quand Window.Close a été appelé, il ne cachait la fenêtre. J'ai finalement pris sur et ajouté ce qui suit:

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

Cela fonctionne très bien - il supprime le gestionnaire d'événements empêchant la fenêtre de fermeture, puis ferme.

+0

Hah, j'ai exactement le même bogue (j'ai oublié de vous désabonner pour fermer le gestionnaire d'événements) lorsque vous essayez de fermer une fenêtre enfant. Sauvé ma journée :) – Nipheris

Questions connexes