Comment supprimer tous les gestionnaires d’événements Click?

Duplication possible: Comment serait-il possible de supprimer tous les gestionnaires d’événements de l’événement Click d’un bouton?

Je souhaite supprimer tous les gestionnaires d’événements de clic d’un bouton. J’ai trouvé cette méthode dans la question de débordement de stack Comment supprimer tous les gestionnaires d’événements d’un contrôle .

private void RemoveClickEvent(Button b) { FieldInfo f1 = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic); object obj = f1.GetValue(b); PropertyInfo pi = b.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); EventHandlerList list = (EventHandlerList)pi.GetValue(b, null); list.RemoveHandler(obj, list[obj]); } 

Mais cette ligne retourne toujours null:

  typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic); 

Et cette méthode a été écrite en 2006.

Existe-t-il une dernière version de cette méthode?

Remarque: je travaille avec WPF et .NET 4.0.

Ci-dessous, une méthode utilitaire utile pour récupérer tous les gestionnaires d’événements souscrits pour tout événement routé:

 ///  /// Gets the list of routed event handlers subscribed to the specified routed event. ///  /// The UI element on which the event is defined. /// The routed event for which to resortingeve the event handlers. /// The list of subscribed routed event handlers. public static RoutedEventHandlerInfo[] GetRoutedEventHandlers(UIElement element, RoutedEvent routedEvent) { // Get the EventHandlersStore instance which holds event handlers for the specified element. // The EventHandlersStore class is declared as internal. var eventHandlersStoreProperty = typeof(UIElement).GetProperty( "EventHandlersStore", BindingFlags.Instance | BindingFlags.NonPublic); object eventHandlersStore = eventHandlersStoreProperty.GetValue(element, null); // Invoke the GetRoutedEventHandlers method on the EventHandlersStore instance // for getting an array of the subscribed event handlers. var getRoutedEventHandlers = eventHandlersStore.GetType().GetMethod( "GetRoutedEventHandlers", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); var routedEventHandlers = (RoutedEventHandlerInfo[])getRoutedEventHandlers.Invoke( eventHandlersStore, new object[] { routedEvent }); return routedEventHandlers; } 

En utilisant ce qui précède, la mise en œuvre de votre méthode devient assez simple:

 private void RemoveClickEvent(Button b) { var routedEventHandlers = GetRoutedEventHandlers(b, ButtonBase.ClickEvent); foreach (var routedEventHandler in routedEventHandlers) b.Click -= (RoutedEventHandler)routedEventHandler.Handler; }