diff --git a/src/Ursa.Themes.Semi/Controls/MultiComboBox.axaml b/src/Ursa.Themes.Semi/Controls/MultiComboBox.axaml new file mode 100644 index 0000000..96fe32a --- /dev/null +++ b/src/Ursa.Themes.Semi/Controls/MultiComboBox.axaml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/Ursa/Controls/ComboBox/MultiComboBox.cs b/src/Ursa/Controls/ComboBox/MultiComboBox.cs new file mode 100644 index 0000000..3bdba24 --- /dev/null +++ b/src/Ursa/Controls/ComboBox/MultiComboBox.cs @@ -0,0 +1,47 @@ +using System.Collections.ObjectModel; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Controls.Templates; + +namespace Ursa.Controls; + +public class MultiComboBox: SelectingItemsControl +{ + private ComboBox _box; + + private static ITemplate _defaultPanel = new FuncTemplate(() => new VirtualizingStackPanel()); + + public static readonly StyledProperty IsDropDownOpenProperty = + ComboBox.IsDropDownOpenProperty.AddOwner(); + + public bool IsDropDownOpen + { + get => GetValue(IsDropDownOpenProperty); + set => SetValue(IsDropDownOpenProperty, value); + } + + static MultiComboBox() + { + FocusableProperty.OverrideDefaultValue(true); + ItemsPanelProperty.OverrideDefaultValue(_defaultPanel); + } + + protected override bool NeedsContainerOverride(object? item, int index, out object? recycleKey) + { + return NeedsContainer(item, out recycleKey); + } + + protected override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey) + { + return new MultiComboBoxItem(); + } + + internal void ItemFocused(MultiComboBoxItem dropDownItem) + { + if (IsDropDownOpen && dropDownItem.IsFocused && dropDownItem.IsArrangeValid) + { + dropDownItem.BringIntoView(); + } + } +} \ No newline at end of file diff --git a/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs b/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs new file mode 100644 index 0000000..8eaf26a --- /dev/null +++ b/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs @@ -0,0 +1,18 @@ +using Avalonia; +using Avalonia.Controls; +using Irihi.Avalonia.Shared.Helpers; + +namespace Ursa.Controls; + +public class MultiComboBoxItem: ListBoxItem +{ + public MultiComboBoxItem() + { + this.GetObservable(IsFocusedProperty).Subscribe(a=> { + if (a) + { + (Parent as MultiComboBox)?.ItemFocused(this); + } + }); + } +} \ No newline at end of file