using System.Collections.Generic; using System.Linq; using Avalonia; using Avalonia.VisualTree; namespace Artemis.UI.Shared.Extensions; /// /// Provides extension methods for Avalonia's type /// public static class VisualExtensions { /// /// Returns a recursive list of all visual children of type . /// /// The type the children should have. /// The root visual at which to start searching. /// A recursive list of all visual children of type . public static List GetVisualChildrenOfType(this IVisual root) { List result = new(); List? visualChildren = root.GetVisualChildren()?.ToList(); if (visualChildren == null || !visualChildren.Any()) return result; foreach (IVisual visualChild in visualChildren) { if (visualChild is T toFind) result.Add(toFind); result.AddRange(GetVisualChildrenOfType(visualChild)); } return result; } /// /// Returns a recursive list of all visual children with a data context of type . /// /// The type of data context the children should have. /// The root visual at which to start searching. /// A recursive list of all visual children with a data context of type . public static List GetVisualChildrenOfDataContextType(this IVisual root) { List result = new(); List? visualChildren = root.GetVisualChildren()?.ToList(); if (visualChildren == null || !visualChildren.Any()) return result; foreach (IVisual visualChild in visualChildren) { if (visualChild is IDataContextProvider dataContextProvider && dataContextProvider.DataContext is T toFind) result.Add(toFind); result.AddRange(GetVisualChildrenOfType(visualChild)); } return result; } }