From 0173ee7c9cbdd974409fe9d340dc1d7927c21aac Mon Sep 17 00:00:00 2001 From: rabbitism Date: Tue, 16 Sep 2025 19:20:02 +0800 Subject: [PATCH] feat: implement inner content interface. --- .../Pages/MultiAutoCompleteBoxDemo.axaml | 4 +- .../MultiAutoCompleteBoxDemoViewModel.cs | 10 +-- .../Controls/MultiAutoCompleteBox.axaml | 70 +++++++++++++------ .../MultiAutoCompleteBox.Properties.cs | 20 +++++- .../AutoCompleteBox/MultiAutoCompleteBox.cs | 2 +- 5 files changed, 76 insertions(+), 30 deletions(-) diff --git a/demo/Ursa.Demo/Pages/MultiAutoCompleteBoxDemo.axaml b/demo/Ursa.Demo/Pages/MultiAutoCompleteBoxDemo.axaml index 98f8db5..80ed76f 100644 --- a/demo/Ursa.Demo/Pages/MultiAutoCompleteBoxDemo.axaml +++ b/demo/Ursa.Demo/Pages/MultiAutoCompleteBoxDemo.axaml @@ -7,9 +7,11 @@ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:DataType="vm:MultiAutoCompleteBoxDemoViewModel" x:Class="Ursa.Demo.Pages.MultiAutoCompleteBoxDemo"> - + diff --git a/demo/Ursa.Demo/ViewModels/MultiAutoCompleteBoxDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/MultiAutoCompleteBoxDemoViewModel.cs index d9cf138..e8cfa31 100644 --- a/demo/Ursa.Demo/ViewModels/MultiAutoCompleteBoxDemoViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/MultiAutoCompleteBoxDemoViewModel.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Collections.ObjectModel; using Avalonia.Controls; using CommunityToolkit.Mvvm.ComponentModel; @@ -82,12 +83,13 @@ public class MultiAutoCompleteBoxDemoViewModel: ObservableObject { if (text is null) return true; if (data is not ControlData control) return false; - return control.MenuHeader.Contains(text )|| control.Chinese.Contains(text); + return control.MenuHeader.Contains(text, StringComparison.InvariantCultureIgnoreCase) || + control.Chinese.Contains(text, StringComparison.InvariantCultureIgnoreCase); } } public class ControlData { - public string MenuHeader { get; set; } - public string Chinese { get; set; } + public required string MenuHeader { get; init; } + public required string Chinese { get; init; } } \ No newline at end of file diff --git a/src/Ursa.Themes.Semi/Controls/MultiAutoCompleteBox.axaml b/src/Ursa.Themes.Semi/Controls/MultiAutoCompleteBox.axaml index 0e7a22b..b406c69 100644 --- a/src/Ursa.Themes.Semi/Controls/MultiAutoCompleteBox.axaml +++ b/src/Ursa.Themes.Semi/Controls/MultiAutoCompleteBox.axaml @@ -12,27 +12,47 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + - + + + + + diff --git a/src/Ursa/Controls/AutoCompleteBox/MultiAutoCompleteBox.Properties.cs b/src/Ursa/Controls/AutoCompleteBox/MultiAutoCompleteBox.Properties.cs index 2736134..a4c249b 100644 --- a/src/Ursa/Controls/AutoCompleteBox/MultiAutoCompleteBox.Properties.cs +++ b/src/Ursa/Controls/AutoCompleteBox/MultiAutoCompleteBox.Properties.cs @@ -511,5 +511,23 @@ public partial class MultiAutoCompleteBox { get => GetValue(InnerRightContentProperty); set => SetValue(InnerRightContentProperty, value); - } + } + + public static readonly StyledProperty PopupInnerTopContentProperty = AvaloniaProperty.Register( + nameof(PopupInnerTopContent)); + + public object? PopupInnerTopContent + { + get => GetValue(PopupInnerTopContentProperty); + set => SetValue(PopupInnerTopContentProperty, value); + } + + public static readonly StyledProperty PopupInnerBottomContentProperty = AvaloniaProperty.Register( + nameof(PopupInnerBottomContent)); + + public object? PopupInnerBottomContent + { + get => GetValue(PopupInnerBottomContentProperty); + set => SetValue(PopupInnerBottomContentProperty, value); + } } \ No newline at end of file diff --git a/src/Ursa/Controls/AutoCompleteBox/MultiAutoCompleteBox.cs b/src/Ursa/Controls/AutoCompleteBox/MultiAutoCompleteBox.cs index c5b8030..829ccd0 100644 --- a/src/Ursa/Controls/AutoCompleteBox/MultiAutoCompleteBox.cs +++ b/src/Ursa/Controls/AutoCompleteBox/MultiAutoCompleteBox.cs @@ -30,7 +30,7 @@ namespace Ursa.Controls; [TemplatePart(ElementSelectionAdapter, typeof(ISelectionAdapter))] [TemplatePart(ElementTextBox, typeof(TextBox))] [PseudoClasses(":dropdownopen")] -public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentControl +public partial class MultiAutoCompleteBox : TemplatedControl, IInnerContentControl, IPopupInnerContent { /// /// Specifies the name of the selection adapter TemplatePart.