diff --git a/src/Ursa.Themes.Semi/Controls/MultiComboBox.axaml b/src/Ursa.Themes.Semi/Controls/MultiComboBox.axaml index 5df1f9b..4e4726a 100644 --- a/src/Ursa.Themes.Semi/Controls/MultiComboBox.axaml +++ b/src/Ursa.Themes.Semi/Controls/MultiComboBox.axaml @@ -5,27 +5,59 @@ + + + + - - - - - - - - - + + + + + + + + + + + + + + IsOpen="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsDropDownOpen, Mode=TwoWay}" + PlacementTarget="PART_RootGrid"> - + @@ -36,7 +68,7 @@ - + @@ -45,7 +77,7 @@ - + @@ -83,7 +115,8 @@ VerticalAlignment="Center" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" - IsVisible="{TemplateBinding Content,Converter={x:Static ObjectConverters.IsNotNull}}" + IsVisible="{TemplateBinding Content, + Converter={x:Static ObjectConverters.IsNotNull}}" RecognizesAccessKey="True" TextWrapping="Wrap" /> @@ -132,10 +165,8 @@ @@ -163,4 +194,12 @@ + + + + + + + + diff --git a/src/Ursa.Themes.Semi/Controls/TagInput.axaml b/src/Ursa.Themes.Semi/Controls/TagInput.axaml index 6829870..4e49cf0 100644 --- a/src/Ursa.Themes.Semi/Controls/TagInput.axaml +++ b/src/Ursa.Themes.Semi/Controls/TagInput.axaml @@ -42,10 +42,10 @@ - - diff --git a/src/Ursa/Controls/ComboBox/MultiComboBox.cs b/src/Ursa/Controls/ComboBox/MultiComboBox.cs index 075e5d1..55115e4 100644 --- a/src/Ursa/Controls/ComboBox/MultiComboBox.cs +++ b/src/Ursa/Controls/ComboBox/MultiComboBox.cs @@ -7,13 +7,18 @@ using Avalonia.Controls; using Avalonia.Controls.Metadata; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; +using Avalonia.Input; using Avalonia.Interactivity; using Irihi.Avalonia.Shared.Helpers; namespace Ursa.Controls; +[TemplatePart(PART_BackgroundBorder, typeof(Border))] public class MultiComboBox: SelectingItemsControl { + public const string PART_BackgroundBorder = "PART_BackgroundBorder"; + private Border? _rootBorder; + private static ITemplate _defaultPanel = new FuncTemplate(() => new VirtualizingStackPanel()); public static readonly StyledProperty IsDropDownOpenProperty = @@ -60,9 +65,18 @@ public class MultiComboBox: SelectingItemsControl return new MultiComboBoxItem(); } - protected override void PrepareContainerForItemOverride(Control container, object? item, int index) + protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { - base.PrepareContainerForItemOverride(container, item, index); + base.OnApplyTemplate(e); + PointerPressedEvent.RemoveHandler(OnBackgroundPointerPressed, _rootBorder); + _rootBorder = e.NameScope.Find(PART_BackgroundBorder); + PointerPressedEvent.AddHandler(OnBackgroundPointerPressed, _rootBorder); + + } + + private void OnBackgroundPointerPressed(object sender, PointerPressedEventArgs e) + { + SetCurrentValue(IsDropDownOpenProperty, !IsDropDownOpen); } internal void ItemFocused(MultiComboBoxItem dropDownItem) @@ -72,4 +86,23 @@ public class MultiComboBox: SelectingItemsControl dropDownItem.BringIntoView(); } } + + public void Remove(object? o) + { + if (o is StyledElement s) + { + var data = s.DataContext; + this.SelectedItems?.Remove(data); + var item = this.Items.FirstOrDefault(a => ReferenceEquals(a, data)); + if (item is not null) + { + var container = ContainerFromItem(item); + if (container is MultiComboBoxItem t) + { + t.IsSelected = false; + } + } + } + + } } \ No newline at end of file diff --git a/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs b/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs index a340d20..1c3931d 100644 --- a/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs +++ b/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs @@ -1,4 +1,5 @@ -using Avalonia; +using System.Windows.Input; +using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Mixins; using Avalonia.Input; diff --git a/src/Ursa/Controls/ComboBox/MultiComboBoxSelectedItemList.cs b/src/Ursa/Controls/ComboBox/MultiComboBoxSelectedItemList.cs new file mode 100644 index 0000000..4f23fd3 --- /dev/null +++ b/src/Ursa/Controls/ComboBox/MultiComboBoxSelectedItemList.cs @@ -0,0 +1,36 @@ +using System.Windows.Input; +using Avalonia; +using Avalonia.Controls; + +namespace Ursa.Controls; + +public class MultiComboBoxSelectedItemList: ItemsControl +{ + public static readonly StyledProperty RemoveCommandProperty = AvaloniaProperty.Register( + nameof(RemoveCommand)); + + public ICommand? RemoveCommand + { + get => GetValue(RemoveCommandProperty); + set => SetValue(RemoveCommandProperty, value); + } + + 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 ClosableTag(); + } + + protected override void PrepareContainerForItemOverride(Control container, object? item, int index) + { + base.PrepareContainerForItemOverride(container, item, index); + if (container is ClosableTag tag) + { + tag.Command = RemoveCommand; + } + } +} \ No newline at end of file