using Avalonia; using Avalonia.Interactivity; using Avalonia.LogicalTree; using Toolkit.UI.Controls.Avalonia; namespace Toolkit.UI.Avalonia; public class NavigationViewExtension { public static readonly AttachedProperty IsItemInvokedEnabledProperty = AvaloniaProperty.RegisterAttached("IsItemInvokedEnabled", typeof(NavigationViewExtension), false); public static readonly RoutedEvent ItemInvokedEvent = RoutedEvent.Register("ItemInvoked", RoutingStrategies.Bubble, typeof(NavigationViewExtension)); static NavigationViewExtension() { IsItemInvokedEnabledProperty.Changed.AddClassHandler(OnIsItemInvokedEnabledPropertyChanged); } private static void OnIsItemInvokedEnabledPropertyChanged(NavigationViewItem sender, AvaloniaPropertyChangedEventArgs args) { bool TrySetupNavigationView() { if (sender.GetLogicalAncestors().OfType().FirstOrDefault() is NavigationView navigationView) { sender.GetObservable(NavigationViewItem.IsSelectedProperty).Subscribe(args => { if (args) { sender.RaiseEvent(new ItemInvokedEventArgs { RoutedEvent = ItemInvokedEvent }); } }); return true; } return false; } if (!TrySetupNavigationView()) { void HandleLoaded(object? _, RoutedEventArgs __) { TrySetupNavigationView(); } sender.Loaded += HandleLoaded; } } public static bool GetIsItemInvokedEnabled(NavigationViewItem element) => element.GetValue(IsItemInvokedEnabledProperty); public static void SetIsItemInvokedEnabled(NavigationViewItem element, bool value) => element.SetValue(IsItemInvokedEnabledProperty, value); public static void AddItemInvokedHandler(NavigationViewItem element, EventHandler handler) => element.AddHandler(ItemInvokedEvent, handler); public static void RemoveItemInvokedHandler(NavigationViewItem element, EventHandler handler) => element.RemoveHandler(ItemInvokedEvent, handler); }