2011-04-14 2 views
1

J'ai un contrôle personnalisé, un curseur de plage, qui est utilisé dans l'une de mes vues.Événements de désabonnement dans le contrôle WPF

Le constructeur ressemble à ceci:

 EventHandler ReCalculateWidthsHandler; 
     public RangeSlider() 
     { 
      ReCalculateWidthsHandler = OnReCalculateWidths; 
      DependencyPropertyDescriptor.FromProperty(ActualWidthProperty, typeof(RangeSlider)). 
       AddValueChanged(this, ReCalculateWidthsHandler); 
     } 

Je ne sais pas quand/comment je peux unscubscribe que gestionnaire d'événements. Il n'y a pas de méthode Dispose dans Control. Y a-t-il un moyen de m'informer que le contrôle est éliminé/supprimé afin que je puisse me désinscrire des événements auxquels je m'abonne?

Cela peut être une question plus générale: Étant donné un contrôle personnalisé qui étend le contrôle, comment pouvez-vous savoir quand il est éliminé?

Merci.

Répondre

2

Habituellement, vous devez utiliser OverrideMetadata pour ajouter un gestionnaire de changement pour la propriété de dépendance. Malheureusement, cela ne fonctionne pas pour les propriétés en lecture seule. C'est pourquoi vous utilisez le descripteur de propriété, je pense. Vous savez que cette manière est trop compliquée car AddValueChanged stocke une référence statique forte qui provoque une fuite de mémoire. Je pense que vous devriez appeler ReCalculateWidthsHandler de l'événement SizeChanged au lieu de vous abonner au descripteur de propriété.

+0

Si je le modifiais pour m'abonner régulièrement à l'événement SizeChanged, où devrais-je me désabonner de cet événement lorsque le contrôle est éliminé? N'aurais-je pas une fuite de mémoire si je ne me suis pas désabonné? – Flack

+0

Non. Il n'y aura pas de référence externe si vous souscrivez un gestionnaire à un événement de la même instance. –

+0

Ah, oui. Cela m'a échappé. Disons qu'un autre contrôle a été transmis à mon contrôle personnalisé et que mon contrôle personnalisé s'est abonné à l'un de ses événements, quelque chose comme otherControl.SomeEvent + = SomeEventHandler. Quand est-ce que mon contrôle personnalisé se désinscrit de cet événement afin qu'une référence à otherControl ne soit pas conservée? – Flack

Questions connexes