From dc1afd5750012cd06f2003804622064a1c41270b Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Sat, 28 Sep 2024 23:57:45 +0100 Subject: [PATCH] Override TabStrip and add TabStripExtension --- Toolkit.UI.Avalonia/ListBoxExtension.cs | 3 +- Toolkit.UI.Avalonia/TabStripExtension.cs | 84 +++++++++ .../TabStrip/TabStrip.axaml | 175 ++++++++++++++++++ .../Themes/ControlResources.axaml | 1 + 4 files changed, 261 insertions(+), 2 deletions(-) create mode 100644 Toolkit.UI.Avalonia/TabStripExtension.cs create mode 100644 Toolkit.UI.Controls.Avalonia/TabStrip/TabStrip.axaml diff --git a/Toolkit.UI.Avalonia/ListBoxExtension.cs b/Toolkit.UI.Avalonia/ListBoxExtension.cs index ff84730..b8339ea 100644 --- a/Toolkit.UI.Avalonia/ListBoxExtension.cs +++ b/Toolkit.UI.Avalonia/ListBoxExtension.cs @@ -2,14 +2,13 @@ using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.LogicalTree; -using Toolkit.UI.Controls.Avalonia; namespace Toolkit.UI.Avalonia; public class ListBoxExtension { public static readonly AttachedProperty IsItemInvokedEnabledProperty = - AvaloniaProperty.RegisterAttached("IsItemInvokedEnabled", + AvaloniaProperty.RegisterAttached("IsItemInvokedEnabled", typeof(ListBoxExtension), false); public static readonly RoutedEvent ItemInvokedEvent = diff --git a/Toolkit.UI.Avalonia/TabStripExtension.cs b/Toolkit.UI.Avalonia/TabStripExtension.cs new file mode 100644 index 0000000..e48056e --- /dev/null +++ b/Toolkit.UI.Avalonia/TabStripExtension.cs @@ -0,0 +1,84 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Interactivity; +using Avalonia.LogicalTree; + +namespace Toolkit.UI.Avalonia; + +public class TabStripExtension +{ + public static readonly AttachedProperty IsItemInvokedEnabledProperty = + AvaloniaProperty.RegisterAttached("IsItemInvokedEnabled", + typeof(TabStripExtension), false); + + public static readonly RoutedEvent ItemInvokedEvent = + RoutedEvent.Register("ItemInvoked", + RoutingStrategies.Bubble, typeof(TabStripExtension)); + + static TabStripExtension() + { + IsItemInvokedEnabledProperty.Changed.AddClassHandler(OnIsItemClickEnabledPropertyChanged); + } + + private static void OnIsItemClickEnabledPropertyChanged(TabStripItem sender, + AvaloniaPropertyChangedEventArgs args) + { + bool TrySetupTabStrip() + { + if (sender.GetLogicalAncestors().OfType().FirstOrDefault() is TabStrip tabStrip) + { + void OnItemInvoked(object? _, SelectionChangedEventArgs args) + { + if (args.AddedItems is { Count: > 0 }) + { + if (sender.DataContext == tabStrip.SelectedItem) + { + sender.RaiseEvent(new ItemInvokedEventArgs { RoutedEvent = ItemInvokedEvent }); + } + } + } + + if (sender.DataContext == tabStrip.SelectedItem) + { + sender.RaiseEvent(new ItemInvokedEventArgs { RoutedEvent = ItemInvokedEvent }); + } + + void HandleUnloaded(object? _, RoutedEventArgs __) + { + tabStrip.SelectionChanged -= OnItemInvoked; + tabStrip.Unloaded -= HandleUnloaded; + } + + tabStrip.SelectionChanged += OnItemInvoked; + tabStrip.Unloaded += HandleUnloaded; + + return true; + } + + return false; + } + + if (!TrySetupTabStrip()) + { + void HandleLoaded(object? _, RoutedEventArgs __) + { + TrySetupTabStrip(); + } + + sender.Loaded += HandleLoaded; + } + } + + public static bool GetIsItemInvokedEnabled(TabStripItem element) => + element.GetValue(IsItemInvokedEnabledProperty); + + public static void SetIsItemInvokedEnabled(TabStripItem element, bool value) => + element.SetValue(IsItemInvokedEnabledProperty, value); + + public static void AddItemInvokedHandler(TabStripItem element, EventHandler handler) => + element.AddHandler(ItemInvokedEvent, handler); + + public static void RemoveItemInvokedHandler(TabStripItem element, EventHandler handler) => + element.RemoveHandler(ItemInvokedEvent, handler); +} diff --git a/Toolkit.UI.Controls.Avalonia/TabStrip/TabStrip.axaml b/Toolkit.UI.Controls.Avalonia/TabStrip/TabStrip.axaml new file mode 100644 index 0000000..f3c3f2f --- /dev/null +++ b/Toolkit.UI.Controls.Avalonia/TabStrip/TabStrip.axaml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml b/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml index b943686..cb4f5f6 100644 --- a/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml +++ b/Toolkit.UI.Controls.Avalonia/Themes/ControlResources.axaml @@ -8,6 +8,7 @@ +