Possible Duplicate: How would that be possible to remove all event handlers of the Click event of a Button?
可能重复:如何删除Button的Click事件的所有事件处理程序?
I want to remove all click event handlers from a button. I found this method in Stack Overflow question How to remove all event handlers from a control.
我想从按钮中删除所有单击事件处理程序。我在Stack Overflow问题中找到了这个方法如何从控件中删除所有事件处理程序。
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]);
}
But this line always returns null:
但是这一行总是返回null:
typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
And this method was written in 2006.
这种方法写于2006年。
Is there any latest version of this method?
这个方法有最新版本吗?
Note: I am working with WPF and .NET 4.0.
注意:我正在使用WPF和.NET 4.0。
1 个解决方案
#1
21
The below is a helpful utility method for retrieving all subscribed event handlers for any routed event:
以下是一个有用的实用程序方法,用于检索任何路由事件的所有订阅事件处理程序:
/// <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;
}
Using the above, the implementation of your method becomes quite simple:
使用上面的方法,您的方法的实现变得非常简单:
private void RemoveClickEvent(Button b)
{
var routedEventHandlers = GetRoutedEventHandlers(b, ButtonBase.ClickEvent);
foreach (var routedEventHandler in routedEventHandlers)
b.Click -= (RoutedEventHandler)routedEventHandler.Handler;
}
#1
21
The below is a helpful utility method for retrieving all subscribed event handlers for any routed event:
以下是一个有用的实用程序方法,用于检索任何路由事件的所有订阅事件处理程序:
/// <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;
}
Using the above, the implementation of your method becomes quite simple:
使用上面的方法,您的方法的实现变得非常简单:
private void RemoveClickEvent(Button b)
{
var routedEventHandlers = GetRoutedEventHandlers(b, ButtonBase.ClickEvent);
foreach (var routedEventHandler in routedEventHandlers)
b.Click -= (RoutedEventHandler)routedEventHandler.Handler;
}