Quelle est la bonne façon de disposer d'une fenêtre WPF?

j'ai une fenêtre WPF que je crée à partir d'une autre fenêtre en appelant Show(), puis en la laissant Close() lui-même. Quand la fenêtre se ferme, je m'attends à ce qu'elle meure, appelle son destructeur, et supprime tous ses éléments enfants (tels que des minuteries..).

Quelle est la bonne façon d'invoquer une telle action?

47
demandé sur Deantwo 2009-02-20 08:33:59

4 réponses

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

toute autre ressource gérée dont vous avez besoin l'élimination déterministe doit être traitée à partir du Fermé événement.

Référence

(note: supprimé réponse précédente, c'était une supposition complètement fausse)

59
répondu Simon Buchan 2014-12-30 19:45:08

il y a très peu d'éléments du FPF qui doivent être explicitement éliminés, contrairement aux formulaires Windows.

dans le cas de Window, appeler Close () est suffisant pour disposer de toutes les ressources gérées et non gérées selon le documentation.

12
répondu Samuel Jack 2009-02-20 10:25:46

juste au cas où, je vais ajouter mes deux cents.

Mon problème est que je n'ai pas fait assez de dépannage. Ma fenêtre était une fenêtre enfant qui pouvait être ouverte, fermée et rouverte, donc j'ai ajouté ce qui suit pour l'empêcher de se fermer complètement:

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

cependant, quand fenêtre.La fermeture a été appelée, elle ne cachait que la fenêtre. Finalement, j'ai pris sur, et a 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 étant fermée, et puis le referme.

8
répondu rookie1024 2016-01-27 08:56:37

En fermant la fenêtre et en étant sûr que vous avez libéré toutes les ressources à elle et à l'un de ses enfants causera tous les éléments bien comportés dans l'arbre logique d'être des ordures collectées.

je dis "bien se comporter" parce qu'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 cadre WPF de base et des contrôles bien écrits, vous devriez être prêt à tout lâcher.

1
répondu Drew Noakes 2009-02-20 14:44:30