J'utilise plusieurs comportements Blend et triggers sur un contrôle Silverlight. Je me demande s'il existe un mécanisme pour se détacher automatiquement ou s'assurer que OnDetaching() est appelé pour un comportement ou un déclencheur lorsque le contrôle n'est plus utilisé (c'est-à-dire retiré de l'arborescence visuelle).Appel automatique de OnDetaching() pour les comportements Silverlight
Mon problème est qu'il y a une fuite de mémoire gérée avec le contrôle en raison de l'un des comportements. Le comportement s'abonne à un événement sur un objet de longue durée dans le remplacement OnAttached() et devrait se désabonner de cet événement dans le remplacement OnDetaching() afin qu'il puisse devenir un candidat pour la récupération de place. Cependant, OnDetaching() ne semble jamais être appelé quand je supprime le contrôle de l'arbre visuel ... la seule façon de le faire est de détacher explicitement les comportements problématiques AVANT de retirer le contrôle et ensuite il est correctement ramassé .
À l'heure actuelle, ma seule solution était de créer une méthode publique dans le code-behind pour le contrôle qui peut passer par et déconnecter tous les comportements connus qui causeraient des problèmes de récupération de place. Il appartiendrait au code client de savoir appeler cela avant de retirer le contrôle du panneau. Je n'aime pas vraiment cette approche, donc je suis à la recherche d'une façon automatique de faire cela que je néglige ou une meilleure suggestion.
public void DetachBehaviors()
{
foreach (var behavior in Interaction.GetBehaviors(this.LayoutRoot))
{
behavior.Detach();
}
//continue detaching all known problematic behaviors on the control....
}
Merci! Cette approche a bien fonctionné pour nos besoins. – Jaans