62 votes

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

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

77voto

Simon Buchan Points 6245

Réponse précédente supprimée (c'était une supposition complètement fausse).

Close () libère toutes les ressources non managées et ferme toutes les fenêtres possédées.

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

16voto

Samuel Jack Points 14556

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

Dans le cas de Windows, appeler Close () suffit pour disposer de toutes les ressources gérées et non gérées conformément à la documentation .

13voto

rookie1024 Points 66

Juste au cas où, je vais ajouter mon grain de sel.

Mon problème était que je n'avais pas fait assez de dépannage. Ma fenêtre est une fenêtre enfant qui pourrait être ouvert, fermé et ré-ouvert, j'ai donc ajouté ce qui suit à l'empêcher de se fermer complètement:

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

Toutefois, lorsque la Fenêtre.Proche a été appelé, il a caché 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énement de la prévention de la fenêtre soit fermée, et puis le referme.

1voto

Drew Noakes Points 69288

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X