diff --git a/src/AtomUI.Controls/Alert/Alert.cs b/src/AtomUI.Controls/Alert/Alert.cs index cef8e3f16..eb07a3c1c 100644 --- a/src/AtomUI.Controls/Alert/Alert.cs +++ b/src/AtomUI.Controls/Alert/Alert.cs @@ -163,7 +163,6 @@ public class Alert : TemplatedControl, { base.OnAttachedToLogicalTree(e); _tokenBindingsDisposable = new CompositeDisposable(); - SetupCloseButton(); } protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e) @@ -179,6 +178,7 @@ public class Alert : TemplatedControl, SharedTokenKey.BorderThickness, BindingPriority.Template, new RenderScaleAwareThicknessConfigure(this))); + SetupCloseButton(); } private void SetupCloseButton() diff --git a/src/AtomUI.Controls/Badge/CountBadge.cs b/src/AtomUI.Controls/Badge/CountBadge.cs index 405ef29f1..fa2885d84 100644 --- a/src/AtomUI.Controls/Badge/CountBadge.cs +++ b/src/AtomUI.Controls/Badge/CountBadge.cs @@ -147,21 +147,6 @@ public class CountBadge : Control, this.BindAnimationProperties(IsMotionEnabledProperty, IsWaveAnimationEnabledProperty); } - public sealed override void ApplyTemplate() - { - base.ApplyTemplate(); - if (!_isInitialized) - { - if (DecoratedTarget is null) - { - CreateBadgeAdorner(); - } - - SetupShowZero(); - _isInitialized = true; - } - } - private CountBadgeAdorner CreateBadgeAdorner() { if (_badgeAdorner is null) @@ -224,6 +209,12 @@ public class CountBadge : Control, { PrepareAdorner(); } + if (DecoratedTarget is null) + { + CreateBadgeAdorner(); + } + + SetupShowZero(); } protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) diff --git a/src/AtomUI.Controls/Badge/CountBadgeAdorner.cs b/src/AtomUI.Controls/Badge/CountBadgeAdorner.cs index d943a237c..feceda8d5 100644 --- a/src/AtomUI.Controls/Badge/CountBadgeAdorner.cs +++ b/src/AtomUI.Controls/Badge/CountBadgeAdorner.cs @@ -175,8 +175,6 @@ internal class CountBadgeAdorner : TemplatedControl _indicatorMotionActor.IsVisible = false; _needInitialHide = false; } - - BuildBoxShadow(); } protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e) @@ -185,6 +183,12 @@ internal class CountBadgeAdorner : TemplatedControl BuildCountText(); } + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + base.OnAttachedToVisualTree(e); + BuildBoxShadow(); + } + private void BuildBoxShadow() { if (BadgeShadowColor is not null) diff --git a/src/AtomUI.Controls/Badge/DotBadge.cs b/src/AtomUI.Controls/Badge/DotBadge.cs index c968b0a52..354c012fb 100644 --- a/src/AtomUI.Controls/Badge/DotBadge.cs +++ b/src/AtomUI.Controls/Badge/DotBadge.cs @@ -185,6 +185,19 @@ public class DotBadge : Control, } } + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + base.OnAttachedToVisualTree(e); + if (DecoratedTarget is null) + { + CreateDotBadgeAdorner(); + } + else + { + PrepareAdorner(); + } + } + protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) { base.OnDetachedFromVisualTree(e); @@ -221,19 +234,6 @@ public class DotBadge : Control, } } - public sealed override void ApplyTemplate() - { - base.ApplyTemplate(); - if (DecoratedTarget is null) - { - CreateDotBadgeAdorner(); - } - else - { - PrepareAdorner(); - } - } - protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs e) { base.OnPropertyChanged(e); diff --git a/src/AtomUI.Controls/Badge/RibbonBadge.cs b/src/AtomUI.Controls/Badge/RibbonBadge.cs index 2244496cb..ce58ff689 100644 --- a/src/AtomUI.Controls/Badge/RibbonBadge.cs +++ b/src/AtomUI.Controls/Badge/RibbonBadge.cs @@ -152,15 +152,6 @@ public class RibbonBadge : Control, } } - public sealed override void ApplyTemplate() - { - base.ApplyTemplate(); - if (DecoratedTarget is null) - { - CreateBadgeAdorner(); - } - } - protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs e) { base.OnPropertyChanged(e); @@ -247,6 +238,10 @@ public class RibbonBadge : Control, { base.OnAttachedToVisualTree(e); PrepareAdorner(); + if (DecoratedTarget is null) + { + CreateBadgeAdorner(); + } } protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) diff --git a/src/AtomUI.Controls/CheckBox/CheckBoxIndicator.cs b/src/AtomUI.Controls/CheckBox/CheckBoxIndicator.cs index 76ac83bc0..aa1570ca8 100644 --- a/src/AtomUI.Controls/CheckBox/CheckBoxIndicator.cs +++ b/src/AtomUI.Controls/CheckBox/CheckBoxIndicator.cs @@ -177,11 +177,6 @@ internal class CheckBoxIndicator : Control, this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(this, BorderThicknessProperty, SharedTokenKey.BorderThickness, BindingPriority.Template, new RenderScaleAwareThicknessConfigure(this))); - } - - public override void ApplyTemplate() - { - base.ApplyTemplate(); SetupTransitions(); } diff --git a/src/AtomUI.Controls/Collapse/Collapse.cs b/src/AtomUI.Controls/Collapse/Collapse.cs index 0cc879e69..2af0c387e 100644 --- a/src/AtomUI.Controls/Collapse/Collapse.cs +++ b/src/AtomUI.Controls/Collapse/Collapse.cs @@ -178,8 +178,7 @@ public class Collapse : SelectingItemsControl, protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { base.OnApplyTemplate(e); - SetupEffectiveBorderThickness(); - SetupSelectionMode(); + } protected override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey) @@ -373,5 +372,7 @@ public class Collapse : SelectingItemsControl, this.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(this, BorderThicknessProperty, SharedTokenKey.BorderThickness, BindingPriority.Template, new RenderScaleAwareThicknessConfigure(this))); + SetupEffectiveBorderThickness(); + SetupSelectionMode(); } } \ No newline at end of file diff --git a/src/AtomUI.Controls/Collapse/CollapseItem.cs b/src/AtomUI.Controls/Collapse/CollapseItem.cs index 3e0725faf..c45c0fbd6 100644 --- a/src/AtomUI.Controls/Collapse/CollapseItem.cs +++ b/src/AtomUI.Controls/Collapse/CollapseItem.cs @@ -1,4 +1,5 @@ -using AtomUI.Controls.Utils; +using System.Diagnostics; +using AtomUI.Controls.Utils; using AtomUI.IconPkg; using AtomUI.IconPkg.AntDesign; using AtomUI.MotionScene; @@ -10,6 +11,7 @@ using Avalonia.Controls.Metadata; using Avalonia.Controls.Mixins; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; +using Avalonia.Data; using Avalonia.VisualTree; namespace AtomUI.Controls; @@ -230,12 +232,12 @@ public class CollapseItem : HeaderedContentControl, protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { - ExpandIcon ??= AntDesignIconPackage.RightOutlined(); - ExpandIcon.SetTemplatedParent(this); base.OnApplyTemplate(e); _motionActor = e.NameScope.Find(CollapseItemTheme.ContentMotionActorPart); _headerDecorator = e.NameScope.Find(CollapseItemTheme.HeaderDecoratorPart); _expandButton = e.NameScope.Find(CollapseItemTheme.ExpandButtonPart); + + // 必须放在这里,因为依赖 _motionActor 是否设置 _tempAnimationDisabled = true; HandleSelectedChanged(); _tempAnimationDisabled = false; @@ -245,6 +247,22 @@ public class CollapseItem : HeaderedContentControl, } } + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + base.OnAttachedToVisualTree(e); + SetupDefaultExpandIcon(); + } + + private void SetupDefaultExpandIcon() + { + if (ExpandIcon is null) + { + ClearValue(ExpandIconProperty); + SetValue(ExpandIconProperty, AntDesignIconPackage.RightOutlined(), BindingPriority.Template); + } + Debug.Assert(ExpandIcon != null); + } + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { base.OnPropertyChanged(change); @@ -257,7 +275,8 @@ public class CollapseItem : HeaderedContentControl, } } - if (change.Property == AddOnContentProperty) + if (change.Property == AddOnContentProperty || + change.Property == ExpandIconProperty) { if (change.OldValue is Control oldControl) { @@ -268,6 +287,10 @@ public class CollapseItem : HeaderedContentControl, { newControl.SetTemplatedParent(this); } + if (change.Property == ExpandIconProperty) + { + SetupDefaultExpandIcon(); + } } }