From 0a3dcf0d8c7f3b00f016eeb56f0a251c5530a5ca Mon Sep 17 00:00:00 2001 From: rabbitism Date: Mon, 12 Feb 2024 00:37:20 +0800 Subject: [PATCH] feat: deal with selection. --- demo/Ursa.Demo/Pages/NavMenuDemo.axaml | 4 ++- src/Ursa.Themes.Semi/Controls/NavMenu.axaml | 24 +++++++-------- src/Ursa/Controls/NavMenu/NavMenu.cs | 34 +++++++++++++++++++-- src/Ursa/Controls/NavMenu/NavMenuItem.cs | 1 + 4 files changed, 47 insertions(+), 16 deletions(-) diff --git a/demo/Ursa.Demo/Pages/NavMenuDemo.axaml b/demo/Ursa.Demo/Pages/NavMenuDemo.axaml index b9d58c6..d0f1648 100644 --- a/demo/Ursa.Demo/Pages/NavMenuDemo.axaml +++ b/demo/Ursa.Demo/Pages/NavMenuDemo.axaml @@ -5,7 +5,7 @@ xmlns:u="https://irihi.tech/ursa" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Ursa.Demo.Pages.NavMenuDemo"> - + @@ -21,5 +21,7 @@ + + diff --git a/src/Ursa.Themes.Semi/Controls/NavMenu.axaml b/src/Ursa.Themes.Semi/Controls/NavMenu.axaml index a2adf6e..6843a3c 100644 --- a/src/Ursa.Themes.Semi/Controls/NavMenu.axaml +++ b/src/Ursa.Themes.Semi/Controls/NavMenu.axaml @@ -14,19 +14,17 @@ - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/src/Ursa/Controls/NavMenu/NavMenu.cs b/src/Ursa/Controls/NavMenu/NavMenu.cs index 4861df5..f0b99b6 100644 --- a/src/Ursa/Controls/NavMenu/NavMenu.cs +++ b/src/Ursa/Controls/NavMenu/NavMenu.cs @@ -1,11 +1,33 @@ -using Avalonia.Controls; +using System.Diagnostics; +using Avalonia; +using Avalonia.Controls; using Avalonia.Controls.Primitives; +using Avalonia.Data; using Avalonia.LogicalTree; namespace Ursa.Controls; -public class NavMenu: SelectingItemsControl +public class NavMenu: ItemsControl { + public static readonly StyledProperty SelectedItemProperty = AvaloniaProperty.Register( + nameof(SelectedItem), defaultBindingMode: BindingMode.TwoWay); + + public object? SelectedItem + { + get => GetValue(SelectedItemProperty); + set => SetValue(SelectedItemProperty, value); + } + + static NavMenu() + { + SelectedItemProperty.Changed.AddClassHandler((o, e) => o.OnSelectedItemChange(e)); + } + + private void OnSelectedItemChange(AvaloniaPropertyChangedEventArgs args) + { + Debug.WriteLine(args.NewValue.Value); + } + protected override bool NeedsContainerOverride(object? item, int index, out object? recycleKey) { return NeedsContainer(item, out recycleKey); @@ -27,6 +49,14 @@ public class NavMenu: SelectingItemsControl child.IsSelected = false; } } + if (item.DataContext is not null && item.DataContext != this.DataContext) + { + SelectedItem = item.DataContext; + } + else + { + SelectedItem = item; + } item.IsSelected = true; } } \ No newline at end of file diff --git a/src/Ursa/Controls/NavMenu/NavMenuItem.cs b/src/Ursa/Controls/NavMenu/NavMenuItem.cs index 8ea4137..6195ed9 100644 --- a/src/Ursa/Controls/NavMenu/NavMenuItem.cs +++ b/src/Ursa/Controls/NavMenu/NavMenuItem.cs @@ -60,6 +60,7 @@ public class NavMenuItem: HeaderedSelectingItemsControl { base.OnAttachedToVisualTree(e); _rootMenu = GetRootMenu(); + UpdateSelection(1); } protected override void OnPointerPressed(PointerPressedEventArgs e)