2012-02-24 47 views
7

thể trùng lặp: How would that be possible to remove all event handlers of the Click event of a Button?Làm cách nào để xóa tất cả trình xử lý sự kiện Nhấp?

Tôi muốn loại bỏ tất cả các xử lý sự kiện nhấp chuột từ một nút. Tôi đã tìm thấy phương pháp này trong câu hỏi Stack Overflow 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]); 
} 

Nhưng dòng này luôn trả về null:

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

Và phương pháp này đã được viết vào năm 2006.

Có bất kỳ phiên bản mới nhất của phương pháp này?

Lưu ý: Tôi đang làm việc với WPF.NET 4.0.

+0

tôi có thể 't giúp đỡ nhiều cho lý do tại sao đó là trở về null, nhưng @JonSkeet có một câu trả lời khá tốt tại http://stackoverflow.com/questions/6828054/how-would-that-be-possible-to-remove-all-event-handlers -of-the-click-event-of-a về lý do tại sao điều này là không thể mà không có sự phản ánh. Có lẽ bạn cần phải tiếp cận vấn đề một cách khác nhau. –

+1

Vấn đề cơ bản bạn đang cố gắng giải quyết/mục tiêu bạn đang cố gắng thực hiện là gì? – RQDQ

+0

Bạn nhận ra rằng bạn đang cố gắng áp dụng mã WinForms cho WPF? – Douglas

Trả lời

19

dưới đây là một phương pháp hữu ích hữu ích để lấy tất cả các xử lý sự kiện đăng ký cho bất kỳ sự kiện chuyển:

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

Sử dụng ở trên, việc thực hiện các phương pháp của bạn trở nên khá đơn giản:

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

Đây là một câu trả lời rất hữu ích mà không may gắn liền với một câu hỏi kín . Tôi nghĩ rằng "trùng lặp" sẽ được cải thiện bởi bạn cung cấp câu trả lời tương tự ở đó là tốt. – phloopy

+1

@phloopy: Đề xuất tốt. Tôi vừa đăng một [phiên bản cải tiến] (http://stackoverflow.com/a/12618521/1149773) của giải pháp trên ở đó. – Douglas

Các vấn đề liên quan