wpf移除事件委託

Ender.Lu發表於2024-10-23
 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);

  

相關文章