From ca196f0cd72ceb68977355bcf40b71b2b1d2bb89 Mon Sep 17 00:00:00 2001 From: chinboy Date: Sat, 1 Nov 2025 09:07:46 +0800 Subject: [PATCH] Add CloseEvent for Tag --- src/AtomUI.Controls/Tag/Tag.cs | 26 +++++++++++++++++++ src/AtomUI.Controls/Tag/Themes/TagTheme.axaml | 2 +- .../Tag/Themes/TagThemeConstants.cs | 6 +++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/AtomUI.Controls/Tag/Themes/TagThemeConstants.cs diff --git a/src/AtomUI.Controls/Tag/Tag.cs b/src/AtomUI.Controls/Tag/Tag.cs index 7e74dcff9..51d57365a 100644 --- a/src/AtomUI.Controls/Tag/Tag.cs +++ b/src/AtomUI.Controls/Tag/Tag.cs @@ -1,3 +1,4 @@ +using AtomUI.Controls.Themes; using AtomUI.IconPkg; using AtomUI.IconPkg.AntDesign; using AtomUI.Theme; @@ -9,6 +10,7 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Data; +using Avalonia.Interactivity; using Avalonia.Media; using Avalonia.Metadata; using Avalonia.VisualTree; @@ -102,6 +104,19 @@ public class Tag : TemplatedControl, IControlSharedTokenResourcesHost #endregion + #region 公共事件定义 + + public static readonly RoutedEvent ClosedEvent = + RoutedEvent.Register(nameof(Closed), RoutingStrategies.Bubble); + + public event EventHandler? Closed + { + add => AddHandler(ClosedEvent, value); + remove => RemoveHandler(ClosedEvent, value); + } + + #endregion + #region 内部属性定义 internal static readonly StyledProperty TagTextPaddingInlineProperty = @@ -160,6 +175,7 @@ public class Tag : TemplatedControl, IControlSharedTokenResourcesHost private static readonly Dictionary PresetColorMap; private static readonly Dictionary StatusColorMap; private IDisposable? _borderThicknessDisposable; + private IconButton? _closeButton; static Tag() { @@ -217,6 +233,11 @@ public class Tag : TemplatedControl, IControlSharedTokenResourcesHost protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { base.OnApplyTemplate(e); + _closeButton = e.NameScope.Find(TagThemeConstants.CloseButtonPart); + if (_closeButton != null) + { + _closeButton.Click += HandleCloseRequest; + } SetupDefaultCloseIcon(); SetupPresetColorMap(); SetupStatusColorMap(); @@ -399,4 +420,9 @@ public class Tag : TemplatedControl, IControlSharedTokenResourcesHost SetValue(CloseIconProperty, AntDesignIconPackage.CloseOutlined()); } } + + private void HandleCloseRequest(object? sender, EventArgs e) + { + RaiseEvent(new RoutedEventArgs(ClosedEvent, this)); + } } \ No newline at end of file diff --git a/src/AtomUI.Controls/Tag/Themes/TagTheme.axaml b/src/AtomUI.Controls/Tag/Themes/TagTheme.axaml index f16ffa12f..2ee2703f6 100644 --- a/src/AtomUI.Controls/Tag/Themes/TagTheme.axaml +++ b/src/AtomUI.Controls/Tag/Themes/TagTheme.axaml @@ -18,7 +18,7 @@ DockPanel.Dock="Left" Icon="{TemplateBinding Icon}" NormalFilledBrush="{TemplateBinding Foreground}" /> - diff --git a/src/AtomUI.Controls/Tag/Themes/TagThemeConstants.cs b/src/AtomUI.Controls/Tag/Themes/TagThemeConstants.cs new file mode 100644 index 000000000..11b7a65c3 --- /dev/null +++ b/src/AtomUI.Controls/Tag/Themes/TagThemeConstants.cs @@ -0,0 +1,6 @@ +namespace AtomUI.Controls.Themes; + +public static class TagThemeConstants +{ + public const string CloseButtonPart = "PART_CloseButton"; +} \ No newline at end of file