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