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