web-dev-qa-db-fra.com

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() elle-même. Lorsque la fenêtre se ferme, je m'attends à ce qu'elle meure, appelle son destructeur et supprime tous ses éléments enfants (tels que les minuteries ..).

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

50
vanja.

Close() libère toutes les ressources non managées et ferme tous les Windows possédés.

Toutes les autres ressources gérées dont vous avez besoin d'une élimination déterministe doivent être gérées depuis l'événement Closed .

Référence

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

64
Simon Buchan

Il y a très peu d'éléments WPF qui doivent être supprimés explicitement, contrairement à Windows Forms.

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

13
Samuel Jack

Au cas où, j'ajouterais 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 pouvait être ouverte, fermée et rouverte, j'ai donc 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, lorsque Window.Close a été appelé, il n'a masqué que la fenêtre. J'ai finalement compris 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 fermeture de la fenêtre, puis la ferme.

10
rookie1024

La fermeture de la fenêtre et la certitude que vous lui avez libéré toutes les ressources et l'un de ses enfants entraîneront le ramassage des ordures de tous les éléments bien comportés de l'arborescence logique.

Je dis "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 dans la pratique si vous utilisez le framework WPF de base et des contrôles bien écrits, vous devriez bien relâchez tout.

1
Drew Noakes