From b15d237056c0954be4f9726db53813cec630b9e5 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Sun, 24 Mar 2024 17:00:34 +0800 Subject: [PATCH] feat: WIP add a demo. --- demo/Ursa.Demo/Pages/MultiComboBoxDemo.axaml | 14 ++++++++ .../Pages/MultiComboBoxDemo.axaml.cs | 13 ++++++++ .../Ursa.Demo/ViewModels/MainViewViewModel.cs | 1 + demo/Ursa.Demo/ViewModels/MenuViewModel.cs | 2 ++ .../ViewModels/MultiComboBoxDemoViewModel.cs | 30 +++++++++++++++++ .../Controls/MultiComboBox.axaml | 2 +- src/Ursa/Controls/ComboBox/MultiComboBox.cs | 32 +++++++++++++++++++ 7 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 demo/Ursa.Demo/Pages/MultiComboBoxDemo.axaml create mode 100644 demo/Ursa.Demo/Pages/MultiComboBoxDemo.axaml.cs create mode 100644 demo/Ursa.Demo/ViewModels/MultiComboBoxDemoViewModel.cs diff --git a/demo/Ursa.Demo/Pages/MultiComboBoxDemo.axaml b/demo/Ursa.Demo/Pages/MultiComboBoxDemo.axaml new file mode 100644 index 0000000..2fb5a4b --- /dev/null +++ b/demo/Ursa.Demo/Pages/MultiComboBoxDemo.axaml @@ -0,0 +1,14 @@ + + + + + diff --git a/demo/Ursa.Demo/Pages/MultiComboBoxDemo.axaml.cs b/demo/Ursa.Demo/Pages/MultiComboBoxDemo.axaml.cs new file mode 100644 index 0000000..2a51be5 --- /dev/null +++ b/demo/Ursa.Demo/Pages/MultiComboBoxDemo.axaml.cs @@ -0,0 +1,13 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace Ursa.Demo.Pages; + +public partial class MultiComboBoxDemo : UserControl +{ + public MultiComboBoxDemo() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs index e55a00a..15af99e 100644 --- a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs @@ -43,6 +43,7 @@ public class MainViewViewModel : ViewModelBase MenuKeys.MenuKeyKeyGestureInput => new KeyGestureInputDemoViewModel(), MenuKeys.MenuKeyLoading => new LoadingDemoViewModel(), MenuKeys.MenuKeyMessageBox => new MessageBoxDemoViewModel(), + MenuKeys.MenuKeyMultiComboBox => new MultiComboBoxDemoViewModel(), MenuKeys.MenuKeyNavMenu => new NavMenuDemoViewModel(), MenuKeys.MenuKeyNumberDisplayer => new NumberDisplayerDemoViewModel(), MenuKeys.MenuKeyNumericUpDown => new NumericUpDownDemoViewModel(), diff --git a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs index 3ac4eac..5a345ef 100644 --- a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs @@ -30,6 +30,7 @@ public class MenuViewModel: ViewModelBase new() { MenuHeader = "KeyGestureInput", Key = MenuKeys.MenuKeyKeyGestureInput }, new() { MenuHeader = "Loading", Key = MenuKeys.MenuKeyLoading }, new() { MenuHeader = "Message Box", Key = MenuKeys.MenuKeyMessageBox }, + new() { MenuHeader = "MultiComboBox", Key = MenuKeys.MenuKeyMultiComboBox, Status = "New" }, new() { MenuHeader = "Nav Menu", Key = MenuKeys.MenuKeyNavMenu, Status = "Updated" }, // new() { MenuHeader = "Number Displayer", Key = MenuKeys.MenuKeyNumberDisplayer, Status = "New" }, new() { MenuHeader = "Numeric UpDown", Key = MenuKeys.MenuKeyNumericUpDown }, @@ -70,6 +71,7 @@ public static class MenuKeys public const string MenuKeyKeyGestureInput = "KeyGestureInput"; public const string MenuKeyLoading = "Loading"; public const string MenuKeyMessageBox = "MessageBox"; + public const string MenuKeyMultiComboBox = "MultiComboBox"; public const string MenuKeyNavMenu = "NavMenu"; public const string MenuKeyNumberDisplayer = "NumberDisplayer"; public const string MenuKeyNumericUpDown = "NumericUpDown"; diff --git a/demo/Ursa.Demo/ViewModels/MultiComboBoxDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/MultiComboBoxDemoViewModel.cs new file mode 100644 index 0000000..239dc58 --- /dev/null +++ b/demo/Ursa.Demo/ViewModels/MultiComboBoxDemoViewModel.cs @@ -0,0 +1,30 @@ +using System.Collections.ObjectModel; +using CommunityToolkit.Mvvm.ComponentModel; + +namespace Ursa.Demo.ViewModels; + +public class MultiComboBoxDemoViewModel: ObservableObject +{ + public ObservableCollection Items { get; set; } + + public MultiComboBoxDemoViewModel() + { + Items = new ObservableCollection() + { + "Item 1", + "Item 2", + "Item 3", + "Item 4", + "Item 5", + "Item 6", + "Item 7", + "Item 8", + "Illinois", + "Indiana", + "Iowa", + "Kansas", + "Kentucky", + "Louisiana", + }; + } +} \ No newline at end of file diff --git a/src/Ursa.Themes.Semi/Controls/MultiComboBox.axaml b/src/Ursa.Themes.Semi/Controls/MultiComboBox.axaml index 9f3ae00..080cbfc 100644 --- a/src/Ursa.Themes.Semi/Controls/MultiComboBox.axaml +++ b/src/Ursa.Themes.Semi/Controls/MultiComboBox.axaml @@ -17,7 +17,7 @@ - + diff --git a/src/Ursa/Controls/ComboBox/MultiComboBox.cs b/src/Ursa/Controls/ComboBox/MultiComboBox.cs index 7ce9d28..29bee67 100644 --- a/src/Ursa/Controls/ComboBox/MultiComboBox.cs +++ b/src/Ursa/Controls/ComboBox/MultiComboBox.cs @@ -3,13 +3,18 @@ using System.Collections.ObjectModel; using System.Collections.Specialized; using Avalonia; using Avalonia.Controls; +using Avalonia.Controls.Metadata; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; namespace Ursa.Controls; +[TemplatePart( PART_ListBox, typeof(ListBox))] public class MultiComboBox: SelectingItemsControl { + public const string PART_ListBox = "PART_ListBox"; + private ListBox? _listBox; + private static ITemplate _defaultPanel = new FuncTemplate(() => new VirtualizingStackPanel()); public static readonly StyledProperty IsDropDownOpenProperty = @@ -20,6 +25,15 @@ public class MultiComboBox: SelectingItemsControl get => GetValue(IsDropDownOpenProperty); set => SetValue(IsDropDownOpenProperty, value); } + + public new static readonly StyledProperty SelectedItemsProperty = AvaloniaProperty.Register( + nameof(SelectedItems)); + + public new IList? SelectedItems + { + get => GetValue(SelectedItemsProperty); + set => SetValue(SelectedItemsProperty, value); + } static MultiComboBox() { @@ -44,4 +58,22 @@ public class MultiComboBox: SelectingItemsControl dropDownItem.BringIntoView(); } } + + protected override void OnApplyTemplate(TemplateAppliedEventArgs e) + { + base.OnApplyTemplate(e); + _listBox = e.NameScope.Find(PART_ListBox); + if (_listBox != null) + { + _listBox.SelectionChanged += ListBox_SelectionChanged; + } + } + + private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (sender == _listBox) + { + this.SelectedItems = _listBox.SelectedItems; + } + } } \ No newline at end of file