diff --git a/src/AtomUI.Controls/Breadcrumb/Breadcrumb.cs b/src/AtomUI.Controls/Breadcrumb/Breadcrumb.cs index 39183a292..a33163d2c 100644 --- a/src/AtomUI.Controls/Breadcrumb/Breadcrumb.cs +++ b/src/AtomUI.Controls/Breadcrumb/Breadcrumb.cs @@ -135,12 +135,12 @@ public class Breadcrumb : ItemsControl, IControlSharedTokenResourcesHost, IMotio { if (breadcrumbItem.Separator == null) { - breadcrumbItem.SetValue(SeparatorProperty, Separator, BindingPriority.Template); + breadcrumbItem.SetCurrentValue(SeparatorProperty, Separator); } if (breadcrumbItem.SeparatorTemplate == null) { - breadcrumbItem.SetValue(SeparatorTemplateProperty, SeparatorTemplate, BindingPriority.Template); + breadcrumbItem.SetCurrentValue(SeparatorTemplateProperty, SeparatorTemplate); } } @@ -149,7 +149,7 @@ public class Breadcrumb : ItemsControl, IControlSharedTokenResourcesHost, IMotio base.OnApplyTemplate(e); if (Separator == null) { - SetValue(SeparatorProperty, DefaultSeparator, BindingPriority.Template); + SetCurrentValue(SeparatorProperty, DefaultSeparator); } } diff --git a/src/AtomUI.Controls/Buttons/Button.cs b/src/AtomUI.Controls/Buttons/Button.cs index d66b8d976..bddc86115 100644 --- a/src/AtomUI.Controls/Buttons/Button.cs +++ b/src/AtomUI.Controls/Buttons/Button.cs @@ -381,6 +381,7 @@ public class Button : AvaloniaButton, base.OnApplyTemplate(e); // 为了防止意外被用户改变背景,做了一个 frame _frame = e.NameScope.Find(ButtonThemeConstants.FramePart); + UpdatePseudoClasses(); } protected override void OnLoaded(RoutedEventArgs e) @@ -414,7 +415,6 @@ public class Button : AvaloniaButton, { base.OnAttachedToVisualTree(e); SetupEffectiveBorderThickness(); - UpdatePseudoClasses(); } private void SetupEffectiveBorderThickness() diff --git a/src/AtomUI.Controls/Collapse/Collapse.cs b/src/AtomUI.Controls/Collapse/Collapse.cs index 206f5a384..b43b0e871 100644 --- a/src/AtomUI.Controls/Collapse/Collapse.cs +++ b/src/AtomUI.Controls/Collapse/Collapse.cs @@ -58,8 +58,14 @@ public class Collapse : SelectingItemsControl, public static readonly StyledProperty ExpandIconPositionProperty = AvaloniaProperty.Register(nameof(ExpandIconPosition)); - public static readonly StyledProperty IsMotionEnabledProperty - = MotionAwareControlProperty.IsMotionEnabledProperty.AddOwner(); + public static readonly StyledProperty IsMotionEnabledProperty = + MotionAwareControlProperty.IsMotionEnabledProperty.AddOwner(); + + public static readonly StyledProperty ItemHeaderPaddingProperty = + AvaloniaProperty.Register(nameof(ItemHeaderPadding)); + + public static readonly StyledProperty ItemContentPaddingProperty = + AvaloniaProperty.Register(nameof(ItemContentPadding)); public SizeType SizeType { @@ -102,6 +108,18 @@ public class Collapse : SelectingItemsControl, get => GetValue(IsMotionEnabledProperty); set => SetValue(IsMotionEnabledProperty, value); } + + public Thickness? ItemHeaderPadding + { + get => GetValue(ItemHeaderPaddingProperty); + set => SetValue(ItemHeaderPaddingProperty, value); + } + + public Thickness? ItemContentPadding + { + get => GetValue(ItemContentPaddingProperty); + set => SetValue(ItemContentPaddingProperty, value); + } #endregion @@ -223,6 +241,7 @@ public class Collapse : SelectingItemsControl, _itemsBindingDisposables.Add(collapseItem, disposables); SetupCollapseBorderThickness(collapseItem, index); + ConfigureItemPaddings(collapseItem); } } @@ -341,6 +360,21 @@ public class Collapse : SelectingItemsControl, { SetupItemsBorderThickness(); } + if (change.Property == ItemHeaderPaddingProperty || + change.Property == ItemContentPaddingProperty) + { + if (Items.Count > 0) + { + for (int i = 0; i < ItemCount; i++) + { + var item = Items[i]; + if (item is CollapseItem collapseItem) + { + ConfigureItemPaddings(collapseItem); + } + } + } + } } private void SetupEffectiveBorderThickness() @@ -381,4 +415,17 @@ public class Collapse : SelectingItemsControl, base.OnDetachedFromLogicalTree(e); this.DisposeTokenBindings(); } + + private void ConfigureItemPaddings(CollapseItem collapseItem) + { + if (collapseItem.HeaderPadding == null) + { + collapseItem.SetCurrentValue(CollapseItem.HeaderPaddingProperty, ItemHeaderPadding); + } + + if (collapseItem.ContentPadding == null) + { + collapseItem.SetCurrentValue(CollapseItem.ContentPaddingProperty, ItemContentPadding); + } + } } \ No newline at end of file diff --git a/src/AtomUI.Controls/Collapse/CollapseItem.cs b/src/AtomUI.Controls/Collapse/CollapseItem.cs index 4dd29bec8..967f3fdbb 100644 --- a/src/AtomUI.Controls/Collapse/CollapseItem.cs +++ b/src/AtomUI.Controls/Collapse/CollapseItem.cs @@ -38,6 +38,12 @@ public class CollapseItem : HeaderedContentControl, public static readonly StyledProperty AddOnContentTemplateProperty = AvaloniaProperty.Register(nameof(AddOnContentTemplate)); + + public static readonly StyledProperty HeaderPaddingProperty = + AvaloniaProperty.Register(nameof(HeaderPadding)); + + public static readonly StyledProperty ContentPaddingProperty = + AvaloniaProperty.Register(nameof(ContentPadding)); public bool IsSelected { @@ -68,7 +74,18 @@ public class CollapseItem : HeaderedContentControl, get => GetValue(AddOnContentTemplateProperty); set => SetValue(AddOnContentTemplateProperty, value); } + + public Thickness? HeaderPadding + { + get => GetValue(HeaderPaddingProperty); + set => SetValue(HeaderPaddingProperty, value); + } + public Thickness? ContentPadding + { + get => GetValue(ContentPaddingProperty); + set => SetValue(ContentPaddingProperty, value); + } #endregion #region 内部属性定义 @@ -267,6 +284,8 @@ public class CollapseItem : HeaderedContentControl, _expandButton.Transitions = null; }; } + + UpdatePseudoClasses(); } protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) @@ -297,6 +316,12 @@ public class CollapseItem : HeaderedContentControl, } } + if (change.Property == ContentPaddingProperty || + change.Property == HeaderPaddingProperty) + { + UpdatePseudoClasses(); + } + if (IsLoaded) { if (change.Property == IsMotionEnabledProperty) @@ -420,4 +445,10 @@ public class CollapseItem : HeaderedContentControl, } } } + + private void UpdatePseudoClasses() + { + PseudoClasses.Set(CollapseItemPseudoClass.CustomHeaderPadding, HeaderPadding != null); + PseudoClasses.Set(CollapseItemPseudoClass.CustomContentPadding, ContentPadding != null); + } } \ No newline at end of file diff --git a/src/AtomUI.Controls/Collapse/CollapseItemPseudoClass.cs b/src/AtomUI.Controls/Collapse/CollapseItemPseudoClass.cs new file mode 100644 index 000000000..095153969 --- /dev/null +++ b/src/AtomUI.Controls/Collapse/CollapseItemPseudoClass.cs @@ -0,0 +1,7 @@ +namespace AtomUI.Controls; + +internal static class CollapseItemPseudoClass +{ + public const string CustomHeaderPadding = ":custom-header-padding"; + public const string CustomContentPadding = ":custom-content-padding"; +} \ No newline at end of file diff --git a/src/AtomUI.Controls/Collapse/Themes/CollapseItemTheme.axaml b/src/AtomUI.Controls/Collapse/Themes/CollapseItemTheme.axaml index b997387a3..43109d4ef 100644 --- a/src/AtomUI.Controls/Collapse/Themes/CollapseItemTheme.axaml +++ b/src/AtomUI.Controls/Collapse/Themes/CollapseItemTheme.axaml @@ -12,7 +12,8 @@ LastChildFill="True"> + BorderThickness="{TemplateBinding HeaderBorderThickness}" + Padding="{TemplateBinding HeaderPadding}"> - + + BorderThickness="{TemplateBinding ContentBorderThickness}" + Padding="{TemplateBinding ContentPadding}"/> @@ -58,87 +61,127 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + - - - - - - - + - + - + - + - + - + - + \ No newline at end of file