wpf移除事件委托
public class EventHandlerHelper { public static Delegate GetEventDelegate(RoutedEventHandlerInfo[] rehis, string method_name) { foreach (RoutedEventHandlerInfo rh in rehis) { if (rh.Handler.Method.Name == method_name) { return rh.Handler; } } return null; } public static void RemoveRoutedEventHandler(object sender, RoutedEvent routedEvent, Delegate handler) { BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.GetProperty | BindingFlags.Default | BindingFlags.GetField | BindingFlags.FlattenHierarchy; FieldInfo fi = sender.GetType().GetField("EventHandlersStoreField", bindingFlags); object EventHandlersStoreField_obj = fi.GetValue(sender); object EventHandlersStoreObj = EventHandlersStoreField_obj.GetType().InvokeMember("GetValue", bindingFlags, null, EventHandlersStoreField_obj, new object[] { sender }); EventHandlersStoreObj.GetType().InvokeMember("RemoveRoutedEventHandler", bindingFlags, null, EventHandlersStoreObj, new object[] { routedEvent, handler }); } public static RoutedEventHandlerInfo[] GetRoutedEventHandlers(object sender, RoutedEvent routedEvent) { BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.GetProperty | BindingFlags.Default | BindingFlags.GetField | BindingFlags.FlattenHierarchy; FieldInfo fi = sender.GetType().GetField("EventHandlersStoreField", bindingFlags); object EventHandlersStoreField_obj = fi.GetValue(sender); object EventHandlersStoreObj = EventHandlersStoreField_obj.GetType().InvokeMember("GetValue", bindingFlags, null, EventHandlersStoreField_obj, new object[] { sender }); RoutedEventHandlerInfo[] rhs = (RoutedEventHandlerInfo[])EventHandlersStoreObj.GetType().InvokeMember("GetRoutedEventHandlers", bindingFlags, null, EventHandlersStoreObj, new object[] { routedEvent }); return rhs; } }
RoutedEventHandlerInfo[] rhs = EventHandlerHelper.GetRoutedEventHandlers(sender, FrameworkElement.LoadedEvent); Delegate dd = EventHandlerHelper.GetEventDelegate(rhs, "MainWindow_Loaded"); EventHandlerHelper.RemoveRoutedEventHandler(sender, FrameworkElement.LoadedEvent, dd);