2012-02-24 22 views
7

Olası Çoğalt: How would that be possible to remove all event handlers of the Click event of a Button?Tüm Click olay işleyicileri nasıl kaldırılır?

Ben bir düğmeden tüm tıklama etkinliği işleyicileri kaldırmak istiyorum. Bu yöntemi Yığın Taşması sorusu How to remove all event handlers from a control'da buldum. Bu yöntemin herhangi bir son sürümü var mı

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

Ve bu yöntem 2006.

yazılmış:

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]); 
} 

Ama bu çizgi her zaman null döndürür?

Not: WPF ve .NET 4.0 ile çalışıyorum.

+0

elimden null'ın niçin döndüğüne çok fazla yardım etmeyin, ama @JonSkeet'in http://stackoverflow.com/questions/6828054/how-would-that-be-possible-to-remove-all-event-handlers adresinde oldukça iyi bir cevabı var. -o-click-olayı-of-a, bunun neden yansıması olmadan mümkün değildir. Belki de soruna farklı şekilde yaklaşmanız gerekir. –

+1

Başarmaya çalıştığınız temel amacı/sorunu çözmeye çalıştığınız sorun nedir? – RQDQ

+0

WinForms kodunu WPF'ye uyguladığınızı biliyor musunuz? – Douglas

cevap

19

altındaki herhangi yönlendirilir olay için tüm abone olay işleyicileri almak için yararlı bir yardımcı program yöntemidir:

/// <summary> 
/// Gets the list of routed event handlers subscribed to the specified routed event. 
/// </summary> 
/// <param name="element">The UI element on which the event is defined.</param> 
/// <param name="routedEvent">The routed event for which to retrieve the event handlers.</param> 
/// <returns>The list of subscribed routed event handlers.</returns> 
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; 
} 

yukarıdaki kullanarak, yöntemin uygulanması oldukça basit olur:

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

Bu, ne yazık ki kapalı bir soruna bağlı olan çok faydalı bir cevaptır. . Bende aynı cevabı verdiğinizde "kopya" kelimesinin geliştirileceğini düşünüyorum. – phloopy

+1

@phloopy: İyi öneri. Sadece yukarıdaki çözümün [geliştirilmiş sürümü] (http://stackoverflow.com/a/12618521/1149773) gönderdim. – Douglas

İlgili konular