Ejemplo n.º 1
0
            private bool PropagageEventRecursive(PointerEventArgs args, Point root, UIElement element, Matrix3x2 currentTransform, Action <UIElement> raiseEvent)
            {
                bool raised      = false;
                var  elementRect = element.LayoutSlotWithMarginsAndAlignments;

                elementRect.X += root.X;
                elementRect.Y += root.Y;

                var position    = args.CurrentPoint.Position;
                var pointer     = new Pointer(args.CurrentPoint.PointerId, PointerDeviceType.Mouse, false, isInRange: true);
                var pointerArgs = new PointerRoutedEventArgs(args, element);

                if (element.RenderTransform != null)
                {
                    currentTransform *= element.RenderTransform.MatrixCore;
                    elementRect       = currentTransform.Transform(elementRect);
                }

                if (elementRect.Contains(position))
                {
                    foreach (var e in element.GetChildren().Reverse().ToArray())
                    {
                        if (PropagageEventRecursive(args, elementRect.Location, e, currentTransform, raiseEvent))
                        {
                            return(true);
                        }
                    }

                    var isHitTestVisible =
                        element.GetValue(HitTestVisibilityProperty) is HitTestVisibility hitTestVisibility &&
                        hitTestVisibility == HitTestVisibility.Visible;

                    if (isHitTestVisible)
                    {
                        if (!element.IsOver(pointer))
                        {
                            element.OnNativePointerEnter(pointerArgs);
                        }

                        raiseEvent(element);
                        return(true);
                    }
                }
                else
                {
                    bool RecursePointerExited(UIElement e)
                    {
                        if (e.IsOver(pointer))
                        {
                            foreach (var child in e.GetChildren().Reverse().ToArray())
                            {
                                if (RecursePointerExited(child))
                                {
                                    return(true);
                                }
                            }

                            e.OnNativePointerExited(pointerArgs);
                            return(true);
                        }

                        return(false);
                    }

                    RecursePointerExited(element);
                }

                return(raised);
            }