using System.Collections.Specialized; using Avalonia; using Avalonia.Collections; namespace Ursa.Themes.Semi; internal class ClassHelper : AvaloniaObject { public static readonly AttachedProperty ClassesProperty = AvaloniaProperty.RegisterAttached("Classes"); public static readonly AttachedProperty ClassSourceProperty = AvaloniaProperty.RegisterAttached("ClassSource"); static ClassHelper() { ClassesProperty.Changed.AddClassHandler(OnClassesChanged); ClassSourceProperty.Changed.AddClassHandler(OnClassSourceChanged); } private static void OnClassSourceChanged(StyledElement arg1, AvaloniaPropertyChangedEventArgs arg2) { if (arg2.NewValue is StyledElement styledElement) { arg1.Classes.Clear(); var nonPseudoClasses = styledElement.Classes.Where(c => !c.StartsWith(":")); arg1.Classes.AddRange(nonPseudoClasses); styledElement.Classes.WeakSubscribe((o, e) => OnSourceClassesChanged(o, e, arg1)); } } private static void OnSourceClassesChanged(object sender, NotifyCollectionChangedEventArgs e, StyledElement target) { if (sender is AvaloniaList classes) { target.Classes.Clear(); var nonPseudoClasses = classes.Where(c => !c.StartsWith(":")); target.Classes.AddRange(nonPseudoClasses); } } public static void SetClasses(AvaloniaObject obj, string value) { obj.SetValue(ClassesProperty, value); } public static string GetClasses(AvaloniaObject obj) { return obj.GetValue(ClassesProperty); } private static void OnClassesChanged(StyledElement sender, AvaloniaPropertyChangedEventArgs value) { var classes = value.GetNewValue(); if (classes is null) return; sender.Classes.Clear(); sender.Classes.Add(classes); } public static void SetClassSource(StyledElement obj, StyledElement value) { obj.SetValue(ClassSourceProperty, value); } public static StyledElement GetClassSource(StyledElement obj) { return obj.GetValue(ClassSourceProperty); } }