예제 #1
0
        private static void HookEvent(UIElement that, EventBinding eventBinding)
        {
            if (!_handlerTable.TryGetValue(that, out var subTable))
            {
                subTable = new Dictionary <string, EventHandlerHolder>();

                _handlerTable.Add(that, subTable);
            }

            string eventName = eventBinding.EventName;

            if (subTable.ContainsKey(eventName))
            {
                throw new InvalidOperationException($"An event binding for the '{eventName}' event already exists.");
            }

            EventHandlerHolder handlerHolder = new EventHandlerHolder(eventBinding);

            subTable[eventName] = handlerHolder;

            EventInfo  eventInfo  = that.GetType().GetEvent(eventName) ?? throw new Exception($"The target object does not have an event named '{eventName}'.");
            MethodInfo methodInfo = handlerHolder.GetType().GetMethod(nameof(EventHandlerHolder.HandleEvent), BindingFlags.Instance | BindingFlags.Public);
            Delegate   handler    = Delegate.CreateDelegate(eventInfo.EventHandlerType, handlerHolder, methodInfo);

            eventInfo.AddEventHandler(that, handler);
        }
예제 #2
0
        private static void UnHookEvent(UIElement that, EventBinding eventBinding)
        {
            string eventName = eventBinding.EventName;

            EventHandlerHolder handlerHolder = _handlerTable[that][eventName];
            EventInfo          eventInfo     = that.GetType().GetEvent(eventName);
            MethodInfo         methodInfo    = handlerHolder.GetType().GetMethod(nameof(EventHandlerHolder.HandleEvent), BindingFlags.Instance | BindingFlags.Public);
            Delegate           handler       = Delegate.CreateDelegate(eventInfo.EventHandlerType, handlerHolder, methodInfo);

            eventInfo.RemoveEventHandler(that, handler);
            _handlerTable[that].Remove(eventName);
        }