Пример #1
0
 private void radioButton_OnClick(object sender, RoutedEventArgs args) {
     foreach (var child in XChildren) {
         if (child is RadioButton && child != sender) {
             ((RadioButton) child).Checked = false;
         }
     }
     ((RadioButton) sender).Checked = true;
     int index = Children.IndexOf((Control) sender);
     SelectedItemIndex = index;
 }
Пример #2
0
 /// <summary>
 /// Adds specified routed event to event queue. This event will be processed in next pass.
 /// </summary>
 internal void QueueEvent(RoutedEvent routedEvent, RoutedEventArgs args) {
     if (routedEvent != args.RoutedEvent)
         throw new ArgumentException("Routed event doesn't match to routedEvent passed.", "args");
     this.eventsQueue.Enqueue(args);
 }
Пример #3
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;
        }
Пример #4
0
 // todo : think about remove it
 internal bool ProcessRoutedEvent(RoutedEvent routedEvent, RoutedEventArgs args) {
     if (null == routedEvent)
         throw new ArgumentNullException("routedEvent");
     if (null == args)
         throw new ArgumentNullException("args");
     //
     return processRoutedEvent(routedEvent, args);
 }
Пример #5
0
 private void CheckBox_OnClick( object sender, RoutedEventArgs routedEventArgs ) {
     Checked = !Checked;
 }