From 4f9b77d56757650f416c933ddd1f866c8e0f0b49 Mon Sep 17 00:00:00 2001
From: NaBian <836904362@qq.com>
Date: Thu, 19 Nov 2020 23:40:47 +0800
Subject: [PATCH 1/3] delete tagpanel
---
.../UserControl/Controls/TagDemoCtl.xaml | 24 +++++++++---------
.../UserControl/Controls/TagDemoCtl.xaml.cs | 18 ++++++-------
.../Controls/Tag/TagContainer.cs | 22 ++++++++++++++++
.../HandyControl_Shared.projitems | 1 +
.../Themes/Styles/Base/TagBaseStyle.xaml | 25 +++++++++++++++++++
.../Themes/Styles/Tag.xaml | 2 ++
6 files changed, 71 insertions(+), 21 deletions(-)
create mode 100644 src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml
index e6cb2880..7926ed2d 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml
@@ -6,17 +6,17 @@
xmlns:ex="clr-namespace:HandyControlDemo.Tools.Extension"
xmlns:hc="https://handyorg.github.io/handycontrol">
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs
index f3251b74..60662402 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs
@@ -11,14 +11,14 @@ namespace HandyControlDemo.UserControl
InitializeComponent();
}
- private void TagPanel_OnAddTagButtonClick(object sender, EventArgs e)
- {
- if (sender is TagPanel panel)
- {
- var tag = new Tag();
- LangProvider.SetLang(tag, ContentProperty, LangKeys.SubTitle);
- panel.Children.Add(tag);
- }
- }
+ //private void TagPanel_OnAddTagButtonClick(object sender, EventArgs e)
+ //{
+ // if (sender is TagPanel panel)
+ // {
+ // var tag = new Tag();
+ // LangProvider.SetLang(tag, ContentProperty, LangKeys.SubTitle);
+ // panel.Children.Add(tag);
+ // }
+ //}
}
}
diff --git a/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs b/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs
new file mode 100644
index 00000000..2d1ea37b
--- /dev/null
+++ b/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs
@@ -0,0 +1,22 @@
+using System.Windows;
+using System.Windows.Controls;
+using HandyControl.Data;
+
+namespace HandyControl.Controls
+{
+ public class TagContainer : ItemsControl
+ {
+ public static readonly DependencyProperty IsToolBarVisibleProperty = DependencyProperty.Register(
+ "IsToolBarVisible", typeof(bool), typeof(TagContainer), new PropertyMetadata(ValueBoxes.FalseBox));
+
+ public bool IsToolBarVisible
+ {
+ get => (bool) GetValue(IsToolBarVisibleProperty);
+ set => SetValue(IsToolBarVisibleProperty, value);
+ }
+
+ protected override DependencyObject GetContainerForItemOverride() => new Tag();
+
+ protected override bool IsItemItsOwnContainerOverride(object item) => item is Tag;
+ }
+}
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
index e92e18b9..758248d4 100644
--- a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
+++ b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
@@ -72,6 +72,7 @@
+
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml
index 192f5573..3694716d 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml
@@ -77,4 +77,29 @@
+
+
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Tag.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Tag.xaml
index 8de82ac7..75595a29 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Tag.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Tag.xaml
@@ -8,4 +8,6 @@
+
+
\ No newline at end of file
From ae36827885cc81471e92a47c4b714eb875ac76f9 Mon Sep 17 00:00:00 2001
From: NaBian <836904362@qq.com>
Date: Fri, 20 Nov 2020 23:40:04 +0800
Subject: [PATCH 2/3] update tag demo
---
.../HandyControlDemo_Code.csproj | 3 +
.../HandyControlDemo_Shared.projitems | 1 +
.../Service/Data/DataService.cs | 2 +-
.../UserControl/Controls/TagDemoCtl.xaml | 37 +++++---
.../UserControl/Controls/TagDemoCtl.xaml.cs | 16 +---
.../ViewModel/Controls/TagDemoViewModel.cs | 13 +++
.../ViewModel/ViewModelLocator.cs | 3 +
.../HandyControl_Shared/Controls/Tag/Tag.cs | 59 ++++++++++++
.../Controls/Tag/TagContainer.cs | 10 --
.../Controls/Tag/TagPanel.cs | 91 -------------------
.../HandyControl_Shared.projitems | 1 -
.../Themes/Styles/Base/TagBaseStyle.xaml | 16 ++--
12 files changed, 112 insertions(+), 140 deletions(-)
create mode 100644 src/Shared/HandyControlDemo_Shared/ViewModel/Controls/TagDemoViewModel.cs
delete mode 100644 src/Shared/HandyControl_Shared/Controls/Tag/TagPanel.cs
diff --git a/src/Shared/HandyControlDemo_Code/HandyControlDemo_Code.csproj b/src/Shared/HandyControlDemo_Code/HandyControlDemo_Code.csproj
index 7757b408..558fd8bb 100644
--- a/src/Shared/HandyControlDemo_Code/HandyControlDemo_Code.csproj
+++ b/src/Shared/HandyControlDemo_Code/HandyControlDemo_Code.csproj
@@ -876,6 +876,9 @@
ViewModel\TabControlDemoViewModel.cs
+
+ ViewModel\TagDemoViewModel.cs
+
ViewModel\WindowDemoViewModel.cs
diff --git a/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems b/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems
index 89e561b3..d1ba9d54 100644
--- a/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems
+++ b/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems
@@ -419,6 +419,7 @@
+
diff --git a/src/Shared/HandyControlDemo_Shared/Service/Data/DataService.cs b/src/Shared/HandyControlDemo_Shared/Service/Data/DataService.cs
index 76c84413..3df40270 100644
--- a/src/Shared/HandyControlDemo_Shared/Service/Data/DataService.cs
+++ b/src/Shared/HandyControlDemo_Shared/Service/Data/DataService.cs
@@ -80,7 +80,7 @@ namespace HandyControlDemo.Service
return list;
}
- public List GetDemoDataList(int count)
+ internal List GetDemoDataList(int count)
{
var list = new List();
for (var i = 1; i <= count; i++)
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml
index 7926ed2d..de559222 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml
@@ -4,19 +4,30 @@
Background="{DynamicResource RegionBrush}"
xmlns:langs="clr-namespace:HandyControlDemo.Properties.Langs"
xmlns:ex="clr-namespace:HandyControlDemo.Tools.Extension"
- xmlns:hc="https://handyorg.github.io/handycontrol">
+ xmlns:hc="https://handyorg.github.io/handycontrol"
+ DataContext="{Binding TagDemo,Source={StaticResource Locator}}">
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs
index 60662402..aaeb7890 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs
@@ -1,8 +1,4 @@
-using System;
-using HandyControl.Controls;
-using HandyControlDemo.Properties.Langs;
-
-namespace HandyControlDemo.UserControl
+namespace HandyControlDemo.UserControl
{
public partial class TagDemoCtl
{
@@ -10,15 +6,5 @@ namespace HandyControlDemo.UserControl
{
InitializeComponent();
}
-
- //private void TagPanel_OnAddTagButtonClick(object sender, EventArgs e)
- //{
- // if (sender is TagPanel panel)
- // {
- // var tag = new Tag();
- // LangProvider.SetLang(tag, ContentProperty, LangKeys.SubTitle);
- // panel.Children.Add(tag);
- // }
- //}
}
}
diff --git a/src/Shared/HandyControlDemo_Shared/ViewModel/Controls/TagDemoViewModel.cs b/src/Shared/HandyControlDemo_Shared/ViewModel/Controls/TagDemoViewModel.cs
new file mode 100644
index 00000000..bd6f4e75
--- /dev/null
+++ b/src/Shared/HandyControlDemo_Shared/ViewModel/Controls/TagDemoViewModel.cs
@@ -0,0 +1,13 @@
+using HandyControlDemo.Data;
+using HandyControlDemo.Service;
+
+namespace HandyControlDemo.ViewModel
+{
+ public class TagDemoViewModel : DemoViewModelBase
+ {
+ public TagDemoViewModel(DataService dataService)
+ {
+ DataList = dataService.GetDemoDataList(10);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs b/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs
index 6c1ba828..271bf4cc 100644
--- a/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs
+++ b/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs
@@ -38,6 +38,7 @@ namespace HandyControlDemo.ViewModel
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
+ SimpleIoc.Default.Register();
}
public static ViewModelLocator Instance => new Lazy(() =>
@@ -97,6 +98,8 @@ namespace HandyControlDemo.ViewModel
public SplitButtonDemoViewModel SplitButtonDemo => SimpleIoc.Default.GetInstance();
+ public TagDemoViewModel TagDemo => SimpleIoc.Default.GetInstance();
+
#endregion
}
}
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/Controls/Tag/Tag.cs b/src/Shared/HandyControl_Shared/Controls/Tag/Tag.cs
index f8dec4e3..6e175a63 100644
--- a/src/Shared/HandyControl_Shared/Controls/Tag/Tag.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Tag/Tag.cs
@@ -1,4 +1,5 @@
using System;
+using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
@@ -52,6 +53,64 @@ namespace HandyControl.Controls
set => SetValue(IsSelectedProperty, ValueBoxes.BooleanBox(value));
}
+ public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(
+ "Header", typeof(object), typeof(Tag), new PropertyMetadata(default, OnHeaderChanged));
+
+ private static void OnHeaderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var ctrl = (Tag)d;
+
+ ctrl.SetValue(HasHeaderPropertyKey, e.NewValue != null ? ValueBoxes.TrueBox : ValueBoxes.FalseBox);
+ ctrl.OnHeaderChanged(e.OldValue, e.NewValue);
+ }
+
+ protected virtual void OnHeaderChanged(object oldHeader, object newHeader)
+ {
+ RemoveLogicalChild(oldHeader);
+ AddLogicalChild(newHeader);
+ }
+
+ public object Header
+ {
+ get => GetValue(HeaderProperty);
+ set => SetValue(HeaderProperty, value);
+ }
+
+ internal static readonly DependencyPropertyKey HasHeaderPropertyKey = DependencyProperty.RegisterReadOnly(
+ "HasHeader", typeof(bool), typeof(Tag), new PropertyMetadata(ValueBoxes.FalseBox));
+
+ public static readonly DependencyProperty HasHeaderProperty = HasHeaderPropertyKey.DependencyProperty;
+
+ [Bindable(false), Browsable(false)]
+ public bool HasHeader => (bool) GetValue(HasHeaderProperty);
+
+ public static readonly DependencyProperty HeaderStringFormatProperty = DependencyProperty.Register(
+ "HeaderStringFormat", typeof(string), typeof(Tag), new PropertyMetadata(default(string)));
+
+ public string HeaderStringFormat
+ {
+ get => (string) GetValue(HeaderStringFormatProperty);
+ set => SetValue(HeaderStringFormatProperty, value);
+ }
+
+ public static readonly DependencyProperty HeaderTemplateSelectorProperty = DependencyProperty.Register(
+ "HeaderTemplateSelector", typeof(DataTemplateSelector), typeof(Tag), new PropertyMetadata(default(DataTemplateSelector)));
+
+ public DataTemplateSelector HeaderTemplateSelector
+ {
+ get => (DataTemplateSelector) GetValue(HeaderTemplateSelectorProperty);
+ set => SetValue(HeaderTemplateSelectorProperty, value);
+ }
+
+ public static readonly DependencyProperty HeaderTemplateProperty = DependencyProperty.Register(
+ "HeaderTemplate", typeof(DataTemplate), typeof(Tag), new PropertyMetadata(default(DataTemplate)));
+
+ public DataTemplate HeaderTemplate
+ {
+ get => (DataTemplate) GetValue(HeaderTemplateProperty);
+ set => SetValue(HeaderTemplateProperty, value);
+ }
+
public static readonly RoutedEvent SelectedEvent = EventManager.RegisterRoutedEvent("Selected", RoutingStrategy.Bubble, typeof(EventHandler), typeof(Tag));
public event EventHandler Selected
diff --git a/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs b/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs
index 2d1ea37b..d569bee4 100644
--- a/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs
@@ -1,20 +1,10 @@
using System.Windows;
using System.Windows.Controls;
-using HandyControl.Data;
namespace HandyControl.Controls
{
public class TagContainer : ItemsControl
{
- public static readonly DependencyProperty IsToolBarVisibleProperty = DependencyProperty.Register(
- "IsToolBarVisible", typeof(bool), typeof(TagContainer), new PropertyMetadata(ValueBoxes.FalseBox));
-
- public bool IsToolBarVisible
- {
- get => (bool) GetValue(IsToolBarVisibleProperty);
- set => SetValue(IsToolBarVisibleProperty, value);
- }
-
protected override DependencyObject GetContainerForItemOverride() => new Tag();
protected override bool IsItemItsOwnContainerOverride(object item) => item is Tag;
diff --git a/src/Shared/HandyControl_Shared/Controls/Tag/TagPanel.cs b/src/Shared/HandyControl_Shared/Controls/Tag/TagPanel.cs
deleted file mode 100644
index dd0ac447..00000000
--- a/src/Shared/HandyControl_Shared/Controls/Tag/TagPanel.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-using System;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Media.Animation;
-using HandyControl.Data;
-using HandyControl.Interactivity;
-using HandyControl.Tools;
-
-namespace HandyControl.Controls
-{
- public class TagPanel : WrapPanel
- {
- private Button _addTagButton;
-
- private bool _isInternalAction;
-
- public TagPanel()
- {
- var behavior = new FluidMoveBehavior
- {
- AppliesTo = FluidMoveScope.Children,
- Duration = new Duration(TimeSpan.FromMilliseconds(200)),
- EaseY = new PowerEase(),
- EaseX = new PowerEase()
- };
- var collection = Interaction.GetBehaviors(this);
- collection.Add(behavior);
-
- AddHandler(Controls.Tag.ClosedEvent, new RoutedEventHandler(Tag_OnClosed));
- }
-
- private void Tag_OnClosed(object sender, RoutedEventArgs e) => Children.Remove(e.OriginalSource as Tag);
-
- public static readonly RoutedEvent AddTagButtonClickEvent = EventManager.RegisterRoutedEvent("AddTagButtonClick", RoutingStrategy.Bubble, typeof(EventHandler), typeof(TagPanel));
-
- public event EventHandler AddTagButtonClick
- {
- add => AddHandler(AddTagButtonClickEvent, value);
- remove => RemoveHandler(AddTagButtonClickEvent, value);
- }
-
- public static readonly DependencyProperty ShowAddButtonProperty = DependencyProperty.Register(
- "ShowAddButton", typeof(bool), typeof(TagPanel), new PropertyMetadata(ValueBoxes.FalseBox));
-
- public bool ShowAddButton
- {
- get => (bool) GetValue(ShowAddButtonProperty);
- set => SetValue(ShowAddButtonProperty, ValueBoxes.BooleanBox(value));
- }
-
- public static readonly DependencyProperty TagMarginProperty = DependencyProperty.Register(
- "TagMargin", typeof(Thickness), typeof(TagPanel), new PropertyMetadata(new Thickness(5)));
-
- public Thickness TagMargin
- {
- get => (Thickness) GetValue(TagMarginProperty);
- set => SetValue(TagMarginProperty, value);
- }
-
- protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
- {
- if (!(visualAdded is Tag tag)) return;
- base.OnVisualChildrenChanged(visualAdded, visualRemoved);
-
- tag.Margin = TagMargin;
- if (_isInternalAction) return;
- if (ShowAddButton)
- {
- _isInternalAction = true;
- if (!Children.Contains(_addTagButton))
- {
- _addTagButton = new Button
- {
- Style = ResourceHelper.GetResource
-
-
\ No newline at end of file
From 0d91919b14b31656485c6639368724fed64e9e9c Mon Sep 17 00:00:00 2001
From: NaBian <836904362@qq.com>
Date: Sat, 21 Nov 2020 22:52:56 +0800
Subject: [PATCH 3/3] completed the branch
---
.../UserControl/Controls/TagDemoCtl.xaml | 18 ++++++--
.../ViewModel/Controls/TagDemoViewModel.cs | 43 +++++++++++++++++--
.../ViewModel/ViewModelLocator.cs | 2 +-
.../Controls/Tag/TagContainer.cs | 43 ++++++++++++++++++-
.../Themes/Styles/Base/TagBaseStyle.xaml | 14 +++---
5 files changed, 106 insertions(+), 14 deletions(-)
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml
index de559222..d1744bb2 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml
@@ -16,18 +16,30 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Shared/HandyControlDemo_Shared/ViewModel/Controls/TagDemoViewModel.cs b/src/Shared/HandyControlDemo_Shared/ViewModel/Controls/TagDemoViewModel.cs
index bd6f4e75..91f12591 100644
--- a/src/Shared/HandyControlDemo_Shared/ViewModel/Controls/TagDemoViewModel.cs
+++ b/src/Shared/HandyControlDemo_Shared/ViewModel/Controls/TagDemoViewModel.cs
@@ -1,13 +1,50 @@
-using HandyControlDemo.Data;
+using System;
+using System.Collections.ObjectModel;
+using GalaSoft.MvvmLight;
+using GalaSoft.MvvmLight.Command;
+using HandyControl.Controls;
+using HandyControlDemo.Data;
+using HandyControlDemo.Properties.Langs;
using HandyControlDemo.Service;
namespace HandyControlDemo.ViewModel
{
- public class TagDemoViewModel : DemoViewModelBase
+ public class TagDemoViewModel : ViewModelBase
{
public TagDemoViewModel(DataService dataService)
{
- DataList = dataService.GetDemoDataList(10);
+ DataList = new ObservableCollection(dataService.GetDemoDataList(10));
}
+
+ public ObservableCollection DataList { get; set; }
+
+ private string _tagName;
+
+ public string TagName
+ {
+ get => _tagName;
+#if NET40
+ set => Set(nameof(TagName), ref _tagName, value);
+#else
+ set => Set(ref _tagName, value);
+#endif
+ }
+
+ public RelayCommand AddItemCmd => new Lazy(() =>
+ new RelayCommand(() =>
+ {
+ if (string.IsNullOrEmpty(TagName))
+ {
+ Growl.Warning(Lang.PlsEnterContent);
+ return;
+ }
+
+ DataList.Insert(0, new DemoDataModel
+ {
+ IsSelected = DataList.Count % 2 == 0,
+ Name = TagName
+ });
+ TagName = string.Empty;
+ })).Value;
}
}
\ No newline at end of file
diff --git a/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs b/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs
index 271bf4cc..834f34e9 100644
--- a/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs
+++ b/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs
@@ -98,7 +98,7 @@ namespace HandyControlDemo.ViewModel
public SplitButtonDemoViewModel SplitButtonDemo => SimpleIoc.Default.GetInstance();
- public TagDemoViewModel TagDemo => SimpleIoc.Default.GetInstance();
+ public TagDemoViewModel TagDemo => new TagDemoViewModel(SimpleIoc.Default.GetInstance());
#endregion
}
diff --git a/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs b/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs
index d569bee4..f79d1488 100644
--- a/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs
@@ -1,10 +1,51 @@
-using System.Windows;
+using System.Collections;
+using System.Windows;
using System.Windows.Controls;
+using HandyControl.Tools.Extension;
namespace HandyControl.Controls
{
public class TagContainer : ItemsControl
{
+ public TagContainer()
+ {
+ AddHandler(Controls.Tag.ClosedEvent, new RoutedEventHandler(Tag_OnClosed));
+ }
+
+ private void Tag_OnClosed(object sender, RoutedEventArgs e)
+ {
+ if (e.OriginalSource is Tag tag)
+ {
+ tag.Hide();
+
+ if (ItemsSource == null)
+ {
+ Items.Remove(tag);
+ }
+ else
+ {
+ var item = ItemContainerGenerator.ItemFromContainer(tag);
+ GetActualList()?.Remove(item);
+ Items.Refresh();
+ }
+ }
+ }
+
+ internal IList GetActualList()
+ {
+ IList list;
+ if (ItemsSource != null)
+ {
+ list = ItemsSource as IList;
+ }
+ else
+ {
+ list = Items;
+ }
+
+ return list;
+ }
+
protected override DependencyObject GetContainerForItemOverride() => new Tag();
protected override bool IsItemItsOwnContainerOverride(object item) => item is Tag;
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml
index e756f371..c87462f9 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml
@@ -7,6 +7,7 @@
+
@@ -21,6 +22,7 @@
+