Ejemplo n.º 1
0
        private IEnumerable <IVisual> HitTest(IVisualNode node, Point p, Rect?clip, Func <IVisual, bool> filter)
        {
            if (filter?.Invoke(node.Visual) != false)
            {
                var clipped = false;

                if (node.ClipToBounds)
                {
                    clip    = clip == null ? node.ClipBounds : clip.Value.Intersect(node.ClipBounds);
                    clipped = !clip.Value.Contains(p);
                }

                if (node.GeometryClip != null)
                {
                    var controlPoint = Root.Visual.TranslatePoint(p, node.Visual);
                    clipped = !node.GeometryClip.FillContains(controlPoint);
                }

                if (!clipped)
                {
                    for (var i = node.Children.Count - 1; i >= 0; --i)
                    {
                        foreach (var h in HitTest(node.Children[i], p, clip, filter))
                        {
                            yield return(h);
                        }
                    }

                    if (node.HitTest(p) && node.Visual.IsAttachedToVisualTree)
                    {
                        yield return(node.Visual);
                    }
                }
            }
        }