2010-02-17 15 views
1

Je crée une fenêtre comme ceci:WPF destruction de classe de fenêtre

if (someCondition) 
{ 
    MyWindow wnd = new MyWindow(); 
    wnd.Owner = this; 
    wnd.ShowDialog(); 
} 

Je veux le destructor de MyWindow à appeler à l'accolade fermante, mais il ne fonctionne pas. Dois-je appeler quelque chose comme supprimer/détruire pour que le destructeur de MyWindow soit appelé?

+0

Pourquoi avez-vous besoin d'appeler le destructeur? Si vous effectuez un nettoyage simple, demandez à MyWindow d'implémenter IDisposable et effectuez le nettoyage dans la méthode Dispose. Je ne crois pas que l'utilisation du destructeur est une bonne idée. – Charlie

Répondre

3

Le "destructeur" ou finalizer tel qu'il est appelé en C# est appelé chaque fois que le garbage collector se sent. Vous pouvez déclencher le récupérateur de place manuellement en utilisant System.GC.Collect(), mais you probably don't want to do this. Si vous parlez Dispose() d'autre part, vous pouvez faire ceci étant appelé en créant la fenêtre dans un « utilisant » clause:

using (var wnd = new MyWindow()) 
{ 
    wnd.Owner = this; 
    wnd.ShowDialog(); 
} 

Ceci ferait wnd.Dispose() soit appelée lorsque la clause est à l'aide fait, et serait essentiellement le même que l'écriture:

var wnd = new MyWindow(); 
wnd.Owner = this; 
wnd.ShowDialog();  
wnd.Dispose(); 

A propos de l'utilisation de l'interface IDisposablethis question pourrait être utile - et several more on StackOverflow.

1
using (MyWindow wnd = new MyWindow()) 
{ 
    wnd.Owner = this; 
    wnd.ShowDialog(); 
} 

Ceci appellera Dispose sur votre fenêtre après l'accolade, qui est ce que je pense que vous recherchez. Votre classe MyWindow devra implémenter IDisposable.

+1

Ne pas être trop pédant, mais la classe implémente déjà 'IDisposable'; ce qu'il va falloir faire est de surcharger 'Dispose'. –

+4

Robert: La classe WPF Window n'implémente pas IDisposable. (Il ne contient aucune ressource non gérée.) Charlie a raison, IDisposable doit être implémenté dans la classe dérivée de MyWindow. – itowlson

+2

Pédanterie échouer .. – Charlie

0

Une petite chose, vous ouvrez la fenêtre, puis vous voulez appeler son destructeur. Cela n'a pas vraiment de sens. Vous devriez fermer la fenêtre et son destructeur sera appelé implicitement.

Si vous voulez l'appeler explicitement, vous devez remplacer Dispose dans votre classe MyWindow. Là, vous pouvez nettoyer toutes les ressources que vous souhaitez éliminer explicitement.

+0

'ShowDialog' ne retourne pas jusqu'à ce que Windows est fermé - donc je ne comprends pas votre réponse? –

+0

donc si 'ShowDialog' ne retourne pas tant que la boîte de dialogue n'est pas fermée, comment appeler le destructeur si le dialogue n'est toujours pas détruit? C'est le point que j'essaie de faire valoir. –