Example #1
0
 public static void AddHandler(object target, RoutedEvent routedEvent, Delegate handler, bool handledEventsToo)
 {
     if (null == target)
         throw new ArgumentNullException("target");
     if (null == routedEvent)
         throw new ArgumentNullException("routedEvent");
     if (null == handler)
         throw new ArgumentNullException("handler");
     //
     RoutedEventKey key = routedEvent.Key;
     if (!routedEvents.ContainsKey(key))
         throw new ArgumentException("Specified routed event is not registered.", "routedEvent");
     RoutedEventInfo routedEventInfo = routedEvents[key];
     bool needAddTarget = true;
     if (routedEventInfo.targetsList != null) {
         RoutedEventTargetInfo targetInfo = routedEventInfo.targetsList.FirstOrDefault(info => info.target == target);
         if (null != targetInfo) {
             if (targetInfo.handlersList == null)
                 targetInfo.handlersList = new List<DelegateInfo>();
             targetInfo.handlersList.Add(new DelegateInfo(handler, handledEventsToo));
             needAddTarget = false;
         }
     }
     if (needAddTarget) {
         RoutedEventTargetInfo targetInfo = new RoutedEventTargetInfo(target);
         targetInfo.handlersList = new List<DelegateInfo>();
         targetInfo.handlersList.Add(new DelegateInfo(handler, handledEventsToo));
         if (routedEventInfo.targetsList == null)
             routedEventInfo.targetsList = new List<RoutedEventTargetInfo>();
         routedEventInfo.targetsList.Add(targetInfo);
     }
 }
        public static void AddHandler(object target, RoutedEvent routedEvent, Delegate handler, bool handledEventsToo)
        {
            if (null == target)
            {
                throw new ArgumentNullException("target");
            }
            if (null == routedEvent)
            {
                throw new ArgumentNullException("routedEvent");
            }
            if (null == handler)
            {
                throw new ArgumentNullException("handler");
            }
            //

            RoutedEventKey key = routedEvent.Key;

//            if (!routedEvents.ContainsKey(key))
//                throw new ArgumentException("Specified routed event is not registered.", "routedEvent");
//            RoutedEventInfo routedEventInfo = routedEvents[key];
            if (!routedEvents.ContainsKey(key))
            {
                routedEvents.Add(key, new RoutedEventInfo(routedEvent));
            }
            RoutedEventInfo routedEventInfo = routedEvents[key];

            bool needAddTarget = true;

            if (routedEventInfo.targetsList != null)
            {
                RoutedEventTargetInfo targetInfo = routedEventInfo.targetsList.FirstOrDefault(info => info.target == target);
                if (null != targetInfo)
                {
                    Console.WriteLine("null != targetInfo");
                    if (targetInfo.handlersList == null)
                    {
                        targetInfo.handlersList = new List <DelegateInfo>();
                    }
                    targetInfo.handlersList.Add(new DelegateInfo(handler, handledEventsToo));
                    needAddTarget = false;
                }
            }
            if (needAddTarget)
            {
                RoutedEventTargetInfo targetInfo = new RoutedEventTargetInfo(target);
                targetInfo.handlersList = new List <DelegateInfo>();
                targetInfo.handlersList.Add(new DelegateInfo(handler, handledEventsToo));
                if (routedEventInfo.targetsList == null)
                {
                    routedEventInfo.targetsList = new List <RoutedEventTargetInfo>();
                }
                routedEventInfo.targetsList.Add(targetInfo);
            }
        }
Example #3
0
        public static void RemoveHandler(object target, RoutedEvent routedEvent, Delegate handler)
        {
            if (null == target)
            {
                throw new ArgumentNullException("target");
            }
            if (null == routedEvent)
            {
                throw new ArgumentNullException("routedEvent");
            }
            if (null == handler)
            {
                throw new ArgumentNullException("handler");
            }
            //
            RoutedEventKey key = routedEvent.Key;

            if (!routedEvents.ContainsKey(key))
            {
                throw new ArgumentException("Specified routed event is not registered.", "routedEvent");
            }
            RoutedEventInfo routedEventInfo = routedEvents[key];

            if (routedEventInfo.targetsList == null)
            {
                throw new InvalidOperationException("Targets list is empty.");
            }
            RoutedEventTargetInfo targetInfo = routedEventInfo.targetsList.FirstOrDefault(info => info.target == target);

            if (null == targetInfo)
            {
                throw new ArgumentException("Target not found in targets list of specified routed event.", "target");
            }
            if (null == targetInfo.handlersList)
            {
                throw new InvalidOperationException("Handlers list is empty.");
            }
            int findIndex = targetInfo.handlersList.FindIndex(info => info.@delegate == handler);

            if (-1 == findIndex)
            {
                throw new ArgumentException("Specified handler not found.", "handler");
            }
            targetInfo.handlersList.RemoveAt(findIndex);
        }
Example #4
0
        private bool processRoutedEvent(RoutedEvent routedEvent, RoutedEventArgs args)
        {
            //
            List <RoutedEventTargetInfo> subscribedTargets = getTargetsSubscribedTo(routedEvent);

            Control capturingControl = inputCaptureStack.Count != 0 ? inputCaptureStack.Peek() : null;

            //
            if (routedEvent.RoutingStrategy == RoutingStrategy.Direct)
            {
                if (null == subscribedTargets)
                {
                    return(false);
                }
                //
                RoutedEventTargetInfo targetInfo =
                    subscribedTargets.FirstOrDefault(info => info.target == args.Source);
                if (null == targetInfo)
                {
                    return(false);
                }

                // если имеется контрол, захватывающий события, события получает только он сам
                // и его дочерние контролы
                if (capturingControl != null)
                {
                    if (!(args.Source is Control))
                    {
                        return(false);
                    }
                    if (!isControlAllowedToReceiveEvents(( Control )args.Source, capturingControl))
                    {
                        return(false);
                    }
                }

                // copy handlersList to local list to avoid modifications when enumerating
                foreach (DelegateInfo delegateInfo in new List <DelegateInfo>(targetInfo.handlersList))
                {
                    if (!args.Handled || delegateInfo.handledEventsToo)
                    {
                        if (delegateInfo.@delegate is RoutedEventHandler)
                        {
                            ((RoutedEventHandler)delegateInfo.@delegate).Invoke(targetInfo.target, args);
                        }
                        else
                        {
                            [email protected](targetInfo.target, args);
                        }
                    }
                }
            }

            Control source = (Control)args.Source;
            // path to source from root element down to Source
            List <Control> path    = new List <Control>();
            Control        current = source;

            while (null != current)
            {
                // та же логика с контролом, захватившим обработку сообщений
                // если имеется контрол, захватывающий события, события получает только он сам
                // и его дочерние контролы
                if (capturingControl == null || isControlAllowedToReceiveEvents(current, capturingControl))
                {
                    path.Insert(0, current);
                    current = current.Parent;
                }
                else
                {
                    break;
                }
            }

            if (routedEvent.RoutingStrategy == RoutingStrategy.Tunnel)
            {
                if (subscribedTargets != null)
                {
                    foreach (Control potentialTarget in path)
                    {
                        Control target = potentialTarget;
                        RoutedEventTargetInfo targetInfo =
                            subscribedTargets.FirstOrDefault(info => info.target == target);
                        if (null != targetInfo)
                        {
                            foreach (DelegateInfo delegateInfo in new List <DelegateInfo>(targetInfo.handlersList))
                            {
                                if (!args.Handled || delegateInfo.handledEventsToo)
                                {
                                    if (delegateInfo.@delegate is RoutedEventHandler)
                                    {
                                        ((RoutedEventHandler)delegateInfo.@delegate).Invoke(target, args);
                                    }
                                    else
                                    {
                                        [email protected](target, args);
                                    }
                                }
                            }
                        }
                    }
                }
                // для парных Preview-событий запускаем соответствующие настоящие события,
                // сохраняя при этом Handled (если Preview событие помечено как Handled=true,
                // то и настоящее событие будет маршрутизировано с Handled=true)
                if (routedEvent == Control.PreviewMouseDownEvent)
                {
                    MouseButtonEventArgs mouseArgs = (( MouseButtonEventArgs )args);
                    MouseButtonEventArgs argsNew   = new MouseButtonEventArgs(
                        args.Source, Control.MouseDownEvent, mouseArgs.RawPosition,
                        mouseArgs.LeftButton, mouseArgs.MiddleButton, mouseArgs.RightButton,
                        mouseArgs.ChangedButton
                        );
                    argsNew.Handled = args.Handled;
                    eventsQueue.Enqueue(argsNew);
                }
                if (routedEvent == Control.PreviewMouseUpEvent)
                {
                    MouseButtonEventArgs mouseArgs = (( MouseButtonEventArgs )args);
                    MouseButtonEventArgs argsNew   = new MouseButtonEventArgs(
                        args.Source, Control.MouseUpEvent, mouseArgs.RawPosition,
                        mouseArgs.LeftButton, mouseArgs.MiddleButton, mouseArgs.RightButton,
                        mouseArgs.ChangedButton
                        );
                    argsNew.Handled = args.Handled;
                    eventsQueue.Enqueue(argsNew);
                }
                if (routedEvent == Control.PreviewMouseMoveEvent)
                {
                    MouseEventArgs mouseArgs = (( MouseEventArgs )args);
                    MouseEventArgs argsNew   = new MouseEventArgs(
                        args.Source, Control.MouseMoveEvent, mouseArgs.RawPosition,
                        mouseArgs.LeftButton, mouseArgs.MiddleButton, mouseArgs.RightButton
                        );
                    argsNew.Handled = args.Handled;
                    eventsQueue.Enqueue(argsNew);
                }
                if (routedEvent == Control.PreviewMouseWheelEvent)
                {
                    MouseWheelEventArgs oldArgs = ((MouseWheelEventArgs)args);
                    MouseEventArgs      argsNew = new MouseWheelEventArgs(
                        args.Source, Control.MouseWheelEvent, oldArgs.RawPosition,
                        oldArgs.LeftButton, oldArgs.MiddleButton, oldArgs.RightButton,
                        oldArgs.Delta
                        );
                    argsNew.Handled = args.Handled;
                    eventsQueue.Enqueue(argsNew);
                }

                if (routedEvent == Control.PreviewKeyDownEvent)
                {
                    KeyEventArgs argsNew      = new KeyEventArgs(args.Source, Control.KeyDownEvent);
                    KeyEventArgs keyEventArgs = (( KeyEventArgs )args);
                    argsNew.UnicodeChar       = keyEventArgs.UnicodeChar;
                    argsNew.bKeyDown          = keyEventArgs.bKeyDown;
                    argsNew.dwControlKeyState = keyEventArgs.dwControlKeyState;
                    argsNew.wRepeatCount      = keyEventArgs.wRepeatCount;
                    argsNew.wVirtualKeyCode   = keyEventArgs.wVirtualKeyCode;
                    argsNew.wVirtualScanCode  = keyEventArgs.wVirtualScanCode;
                    argsNew.Handled           = args.Handled;
                    eventsQueue.Enqueue(argsNew);
                }
                if (routedEvent == Control.PreviewKeyUpEvent)
                {
                    KeyEventArgs argsNew      = new KeyEventArgs(args.Source, Control.KeyUpEvent);
                    KeyEventArgs keyEventArgs = (( KeyEventArgs )args);
                    argsNew.UnicodeChar       = keyEventArgs.UnicodeChar;
                    argsNew.bKeyDown          = keyEventArgs.bKeyDown;
                    argsNew.dwControlKeyState = keyEventArgs.dwControlKeyState;
                    argsNew.wRepeatCount      = keyEventArgs.wRepeatCount;
                    argsNew.wVirtualKeyCode   = keyEventArgs.wVirtualKeyCode;
                    argsNew.wVirtualScanCode  = keyEventArgs.wVirtualScanCode;
                    argsNew.Handled           = args.Handled;
                    eventsQueue.Enqueue(argsNew);
                }
            }

            if (routedEvent.RoutingStrategy == RoutingStrategy.Bubble)
            {
                if (subscribedTargets != null)
                {
                    for (int i = path.Count - 1; i >= 0; i--)
                    {
                        Control target = path[i];
                        RoutedEventTargetInfo targetInfo =
                            subscribedTargets.FirstOrDefault(info => info.target == target);
                        if (null != targetInfo)
                        {
                            //
                            foreach (DelegateInfo delegateInfo in new List <DelegateInfo>(targetInfo.handlersList))
                            {
                                if (!args.Handled || delegateInfo.handledEventsToo)
                                {
                                    if (delegateInfo.@delegate is RoutedEventHandler)
                                    {
                                        ((RoutedEventHandler)delegateInfo.@delegate).Invoke(target, args);
                                    }
                                    else
                                    {
                                        [email protected](target, args);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(args.Handled);
        }