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