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); } }
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); }
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); }