// ----------------------------------------------------------------------- // // Copyright 2014 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- namespace Perspex { using System; using System.Linq; public static class VisualExtensions { public static T GetVisualAncestor(this IVisual visual) where T : class { Contract.Requires(visual != null); visual = visual.VisualParent; while (visual != null) { if (visual is T) { return (T)visual; } else { visual = visual.VisualParent; } } return null; } public static T GetVisualAncestorOrSelf(this IVisual visual) where T : class { Contract.Requires(visual != null); return (visual as T) ?? visual.GetVisualAncestor(); } public static IVisual GetVisualAt(this IVisual visual, Point p) { Contract.Requires(visual != null); if (visual.Bounds.Contains(p)) { p -= visual.Bounds.Position; if (visual.VisualChildren.Any()) { foreach (IVisual child in visual.VisualChildren) { IVisual hit = child.GetVisualAt(p); if (hit != null) { return hit; } } } else { return visual; } } return null; } } }