2012-02-24 22 views
7

संभव डुप्लिकेट: How would that be possible to remove all event handlers of the Click event of a Button?सभी क्लिक ईवेंट हैंडलर को कैसे हटाएं?

मैं एक बटन से सभी क्लिक करें घटना संचालकों निकालना चाहते हैं। मुझे इस विधि को स्टैक ओवरफ़्लो प्रश्न How to remove all event handlers from a control में मिला।

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

लेकिन इस लाइन हमेशा रिटर्न अशक्त:

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

और इस विधि 2006

में लिखा गया था कि इस विधि के किसी भी नवीनतम संस्करण है?

नोट: मैं WPF और .NET 4.0 के साथ काम कर रहा हूं।

+0

मैं कर सकते हैं यह बहुत मदद नहीं कर रहा है कि वह वापस क्यों लौट रहा है, लेकिन @ जोनस्केट के पास http://stackoverflow.com/questions/6828054/how-would-that-be-possible-to-remove-all-event-handlers पर एक बहुत अच्छा जवाब है -फ-द-क्लिक-इवेंट-ऑन-ऑन क्यों प्रतिबिंब के बिना यह संभव नहीं है। शायद आपको समस्या से अलग-अलग संपर्क करने की आवश्यकता है। –

+1

आप जिस मौलिक समस्या को हल करने की कोशिश कर रहे हैं/लक्ष्य को पूरा करने का प्रयास कर रहे हैं? – RQDQ

+0

आपको एहसास है कि आप WinForms कोड को WPF पर लागू करने का प्रयास कर रहे हैं? – Douglas

उत्तर

19

नीचे किसी भी कराई घटना के लिए सभी की सदस्यता ली ईवेंट हैंडलर्स पुन: प्राप्त करने के लिए एक उपयोगी उपयोगिता विधि है:

/// <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; 
} 

ऊपर का उपयोग करना, अपने विधि के क्रियान्वयन काफी सरल हो जाता है:

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

यह एक बहुत ही उपयोगी उत्तर है जो दुर्भाग्य से बंद प्रश्न से जुड़ा हुआ है । मुझे लगता है कि आप भी वही उत्तर प्रदान करके "डुप्लिकेट" में सुधार करेंगे। – phloopy

+1

@phloopy: अच्छा सुझाव। मैंने अभी उपरोक्त समाधान के एक [बेहतर संस्करण] (http://stackoverflow.com/a/12618521/1149773) पोस्ट किया है। – Douglas

संबंधित मुद्दे