Quelle est la manière correcte de disposer d’une fenêtre WPF?

J’ai une fenêtre WPF que je crée depuis une autre fenêtre en appelant Show() , puis en la laissant se Close() . Lorsque la fenêtre se ferme, je m’attends à ce qu’elle meure, appelle son destructeur et supprime tous ses éléments enfants (comme les timers ..).

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

Close() libère toutes les ressources non gérées et ferme toutes les Window appartenant.

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

Référence

(note: suppression de la réponse précédente, c’était complètement faux)

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

Dans le cas de Window, l’appel de Close () est suffisant pour disposer de toutes les ressources gérées et non gérées conformément à la documentation .

Juste au cas où, j’appendai mes deux cents.

Mon problème était que je ne faisais pas assez de dépannage. Ma fenêtre était une fenêtre enfant qui pouvait être ouverte, fermée et ré-ouverte, 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, lorsque Window.Close a été appelée, elle 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 bien – il supprime le gestionnaire d’événements empêchant la fermeture de la fenêtre, puis le ferme.

En fermant la fenêtre et en ayant l’assurance que vous y avez libéré toutes les ressources et l’un de ses enfants, tous les éléments sains de l’arbre logique seront détruits.

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, Il suffit de tout libérer.