diff --git a/src/AtomUI.Controls/Buttons/Button.cs b/src/AtomUI.Controls/Buttons/Button.cs index 3f30d9b67..5d547a3ca 100644 --- a/src/AtomUI.Controls/Buttons/Button.cs +++ b/src/AtomUI.Controls/Buttons/Button.cs @@ -17,6 +17,7 @@ using Avalonia.Data; using Avalonia.Layout; using Avalonia.LogicalTree; using Avalonia.Media; +using Avalonia.Utilities; namespace AtomUI.Controls; @@ -239,8 +240,7 @@ public class Button : AvaloniaButton, CompositeDisposable? ITokenResourceConsumer.TokenBindingsDisposable => _tokenBindingsDisposable; #endregion - - private bool _initialized; + private Icon? _loadingIcon; private CompositeDisposable? _tokenBindingsDisposable; @@ -269,7 +269,7 @@ public class Button : AvaloniaButton, protected override Size MeasureOverride(Size availableSize) { - var size = base.MeasureOverride(availableSize); + var size = base.MeasureOverride(availableSize); var targetWidth = size.Width; var targetHeight = size.Height; @@ -287,7 +287,7 @@ public class Button : AvaloniaButton, CornerRadius = new CornerRadius(targetHeight); targetWidth = Math.Max(targetWidth, targetHeight + targetHeight / 2); } - + return new Size(targetWidth, targetHeight); } @@ -295,62 +295,57 @@ public class Button : AvaloniaButton, { base.OnAttachedToLogicalTree(e); _tokenBindingsDisposable = new CompositeDisposable(); - if (!_initialized) + if (Text is null && Content is string content) { - if (Text is null && Content is string content) - { - Text = content; - Content = null; - } + Text = content; + Content = null; + } - if (ButtonType == ButtonType.Default) + if (ButtonType == ButtonType.Default) + { + if (IsDanger) { - if (IsDanger) + Effect = new DropShadowEffect { - Effect = new DropShadowEffect - { - OffsetX = DangerShadow.OffsetX, - OffsetY = DangerShadow.OffsetY, - Color = DangerShadow.Color, - BlurRadius = DangerShadow.Blur - }; - } - else - { - Effect = new DropShadowEffect - { - OffsetX = DefaultShadow.OffsetX, - OffsetY = DefaultShadow.OffsetY, - Color = DefaultShadow.Color, - BlurRadius = DefaultShadow.Blur - }; - } + OffsetX = DangerShadow.OffsetX, + OffsetY = DangerShadow.OffsetY, + Color = DangerShadow.Color, + BlurRadius = DangerShadow.Blur + }; } - else if (ButtonType == ButtonType.Primary) + else { - if (IsDanger) + Effect = new DropShadowEffect { - Effect = new DropShadowEffect - { - OffsetX = DangerShadow.OffsetX, - OffsetY = DangerShadow.OffsetY, - Color = DangerShadow.Color, - BlurRadius = DangerShadow.Blur - }; - } - else + OffsetX = DefaultShadow.OffsetX, + OffsetY = DefaultShadow.OffsetY, + Color = DefaultShadow.Color, + BlurRadius = DefaultShadow.Blur + }; + } + } + else if (ButtonType == ButtonType.Primary) + { + if (IsDanger) + { + Effect = new DropShadowEffect { - Effect = new DropShadowEffect - { - OffsetX = PrimaryShadow.OffsetX, - OffsetY = PrimaryShadow.OffsetY, - Color = PrimaryShadow.Color, - BlurRadius = PrimaryShadow.Blur - }; - } + OffsetX = DangerShadow.OffsetX, + OffsetY = DangerShadow.OffsetY, + Color = DangerShadow.Color, + BlurRadius = DangerShadow.Blur + }; + } + else + { + Effect = new DropShadowEffect + { + OffsetX = PrimaryShadow.OffsetX, + OffsetY = PrimaryShadow.OffsetY, + Color = PrimaryShadow.Color, + BlurRadius = PrimaryShadow.Blur + }; } - - _initialized = true; } SetupControlThemeBindings(); diff --git a/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenterTheme.cs b/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenterTheme.cs index ac2f80c55..be1c44b55 100644 --- a/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenterTheme.cs +++ b/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenterTheme.cs @@ -36,18 +36,22 @@ internal class MenuFlyoutPresenterTheme : BaseControlTheme CreateTemplateParentBinding(arrowDecorator, ArrowDecoratedBox.ArrowPositionProperty, MenuFlyoutPresenter.ArrowPositionProperty); - menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, TemplatedControl.BackgroundProperty, - MenuTokenKey.MenuBgColor)); - menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, Layoutable.MinWidthProperty, - MenuTokenKey.MenuPopupMinWidth)); - menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, Layoutable.MaxWidthProperty, - MenuTokenKey.MenuPopupMaxWidth)); - menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, Layoutable.MinHeightProperty, - MenuTokenKey.MenuPopupMinHeight)); - menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, Layoutable.MaxHeightProperty, - MenuTokenKey.MenuPopupMaxHeight)); - menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, TemplatedControl.PaddingProperty, - MenuTokenKey.MenuPopupContentPadding)); + + RegisterTokenResourceBindings(menuFlyoutPresenter, () => + { + menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, TemplatedControl.BackgroundProperty, + MenuTokenKey.MenuBgColor)); + menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, Layoutable.MinWidthProperty, + MenuTokenKey.MenuPopupMinWidth)); + menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, Layoutable.MaxWidthProperty, + MenuTokenKey.MenuPopupMaxWidth)); + menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, Layoutable.MinHeightProperty, + MenuTokenKey.MenuPopupMinHeight)); + menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, Layoutable.MaxHeightProperty, + MenuTokenKey.MenuPopupMaxHeight)); + menuFlyoutPresenter.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(arrowDecorator, TemplatedControl.PaddingProperty, + MenuTokenKey.MenuPopupContentPadding)); + }); var scrollViewer = new MenuScrollViewer { diff --git a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs index f45c4eda2..79c6b9268 100644 --- a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs +++ b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs @@ -501,9 +501,10 @@ namespace AtomUI.Theme.Styling { public static readonly TokenResourceKey PopupMinWidth = new TokenResourceKey("PopupConfirm.PopupMinWidth"); public static readonly TokenResourceKey PopupMinHeight = new TokenResourceKey("PopupConfirm.PopupMinHeight"); - public static readonly TokenResourceKey ButtonMargin = new TokenResourceKey("PopupConfirm.ButtonMargin"); + public static readonly TokenResourceKey ButtonSpacing = new TokenResourceKey("PopupConfirm.ButtonSpacing"); public static readonly TokenResourceKey IconMargin = new TokenResourceKey("PopupConfirm.IconMargin"); public static readonly TokenResourceKey ContentContainerMargin = new TokenResourceKey("PopupConfirm.ContentContainerMargin"); + public static readonly TokenResourceKey ButtonContainerMargin = new TokenResourceKey("PopupConfirm.ButtonContainerMargin"); public static readonly TokenResourceKey TitleMargin = new TokenResourceKey("PopupConfirm.TitleMargin"); } diff --git a/src/AtomUI.Controls/Menu/ContextMenuTheme.cs b/src/AtomUI.Controls/Menu/ContextMenuTheme.cs index bcc7b3752..9b0b9e6a8 100644 --- a/src/AtomUI.Controls/Menu/ContextMenuTheme.cs +++ b/src/AtomUI.Controls/Menu/ContextMenuTheme.cs @@ -30,20 +30,24 @@ internal class ContextMenuTheme : BaseControlTheme { Name = RootContainerPart }; - contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Border.BackgroundProperty, - MenuTokenKey.MenuBgColor)); - contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Layoutable.MinWidthProperty, - MenuTokenKey.MenuPopupMinWidth)); - contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Layoutable.MaxWidthProperty, - MenuTokenKey.MenuPopupMaxWidth)); - contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Layoutable.MinHeightProperty, - MenuTokenKey.MenuPopupMinHeight)); - contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Layoutable.MaxHeightProperty, - MenuTokenKey.MenuPopupMaxHeight)); - contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Decorator.PaddingProperty, - MenuTokenKey.MenuPopupContentPadding)); - contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Border.CornerRadiusProperty, - MenuTokenKey.MenuPopupBorderRadius)); + + RegisterTokenResourceBindings(contextMenu, () => + { + contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Border.BackgroundProperty, + MenuTokenKey.MenuBgColor)); + contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Layoutable.MinWidthProperty, + MenuTokenKey.MenuPopupMinWidth)); + contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Layoutable.MaxWidthProperty, + MenuTokenKey.MenuPopupMaxWidth)); + contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Layoutable.MinHeightProperty, + MenuTokenKey.MenuPopupMinHeight)); + contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Layoutable.MaxHeightProperty, + MenuTokenKey.MenuPopupMaxHeight)); + contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Decorator.PaddingProperty, + MenuTokenKey.MenuPopupContentPadding)); + contextMenu.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(wrapper, Border.CornerRadiusProperty, + MenuTokenKey.MenuPopupBorderRadius)); + }); var scrollViewer = new MenuScrollViewer(); var itemsPresenter = new ItemsPresenter diff --git a/src/AtomUI.Controls/Menu/MenuItem.cs b/src/AtomUI.Controls/Menu/MenuItem.cs index b2c1faf10..edab49a5d 100644 --- a/src/AtomUI.Controls/Menu/MenuItem.cs +++ b/src/AtomUI.Controls/Menu/MenuItem.cs @@ -83,8 +83,6 @@ public class MenuItem : AvaloniaMenuItem, { _togglePresenter = scope.Find(MenuItemTheme.TogglePresenterPart); } - - SetupIconBindings(); HandleToggleTypeChanged(); SetupTransitions(); UpdatePseudoClasses(); @@ -199,6 +197,7 @@ public class MenuItem : AvaloniaMenuItem, { base.OnAttachedToLogicalTree(e); _tokenBindingsDisposable = new CompositeDisposable(); + SetupIconBindings(); } protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e) diff --git a/src/AtomUI.Controls/Menu/MenuItemTheme.cs b/src/AtomUI.Controls/Menu/MenuItemTheme.cs index bae35e83c..5cb654fc5 100644 --- a/src/AtomUI.Controls/Menu/MenuItemTheme.cs +++ b/src/AtomUI.Controls/Menu/MenuItemTheme.cs @@ -1,4 +1,5 @@ -using AtomUI.IconPkg.AntDesign; +using System.Reactive.Disposables; +using AtomUI.IconPkg.AntDesign; using AtomUI.Media; using AtomUI.Theme; using AtomUI.Theme.Data; @@ -83,8 +84,7 @@ internal class MenuItemTheme : BaseControlTheme }; CreateTemplateParentBinding(togglePresenter, InputElement.IsEnabledProperty, InputElement.IsEnabledProperty); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(togglePresenter, Layoutable.MarginProperty, - MenuTokenKey.ItemMargin)); + Grid.SetColumn(togglePresenter, 0); togglePresenter.RegisterInNameScope(scope); @@ -98,12 +98,7 @@ internal class MenuItemTheme : BaseControlTheme Grid.SetColumn(iconPresenter, 1); iconPresenter.RegisterInNameScope(scope); CreateTemplateParentBinding(iconPresenter, ContentControl.ContentProperty, MenuItem.IconProperty); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconPresenter, Layoutable.MarginProperty, - MenuTokenKey.ItemMargin)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconPresenter, Layoutable.WidthProperty, - MenuTokenKey.ItemIconSize)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconPresenter, Layoutable.HeightProperty, - MenuTokenKey.ItemIconSize)); + var itemTextPresenter = new ContentPresenter { @@ -114,8 +109,7 @@ internal class MenuItemTheme : BaseControlTheme IsHitTestVisible = false }; Grid.SetColumn(itemTextPresenter, 2); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(itemTextPresenter, Layoutable.MarginProperty, - MenuTokenKey.ItemMargin)); + CreateTemplateParentBinding(itemTextPresenter, ContentPresenter.ContentProperty, HeaderedSelectingItemsControl.HeaderProperty, BindingMode.Default, @@ -146,8 +140,7 @@ internal class MenuItemTheme : BaseControlTheme VerticalAlignment = VerticalAlignment.Center }; Grid.SetColumn(inputGestureText, 3); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(inputGestureText, Layoutable.MarginProperty, - MenuTokenKey.ItemMargin)); + CreateTemplateParentBinding(inputGestureText, SingleLineText.TextProperty, Avalonia.Controls.MenuItem.InputGestureProperty, @@ -161,10 +154,7 @@ internal class MenuItemTheme : BaseControlTheme menuIndicatorIcon.HorizontalAlignment = HorizontalAlignment.Right; menuIndicatorIcon.VerticalAlignment = VerticalAlignment.Center; - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuIndicatorIcon, Layoutable.WidthProperty, - SharedTokenKey.IconSizeXS)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuIndicatorIcon, Layoutable.HeightProperty, - SharedTokenKey.IconSizeXS)); + Grid.SetColumn(menuIndicatorIcon, 4); menuIndicatorIcon.RegisterInNameScope(scope); @@ -180,6 +170,38 @@ internal class MenuItemTheme : BaseControlTheme container.Child = layout; layoutWrapper.Children.Add(container); + + RegisterTokenResourceBindings(menuItem, () => + { + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(togglePresenter, + Layoutable.MarginProperty, + MenuTokenKey.ItemMargin)); + + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(inputGestureText, + Layoutable.MarginProperty, + MenuTokenKey.ItemMargin)); + + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconPresenter, + Layoutable.MarginProperty, + MenuTokenKey.ItemMargin)); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconPresenter, + Layoutable.WidthProperty, + MenuTokenKey.ItemIconSize)); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(iconPresenter, + Layoutable.HeightProperty, + MenuTokenKey.ItemIconSize)); + + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(itemTextPresenter, + Layoutable.MarginProperty, + MenuTokenKey.ItemMargin)); + + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuIndicatorIcon, + Layoutable.WidthProperty, + SharedTokenKey.IconSizeXS)); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(menuIndicatorIcon, + Layoutable.HeightProperty, + SharedTokenKey.IconSizeXS)); + }); return layoutWrapper; }); } @@ -195,20 +217,7 @@ internal class MenuItemTheme : BaseControlTheme }; var border = new Border(); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Border.BackgroundProperty, - SharedTokenKey.ColorBgContainer)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Border.CornerRadiusProperty, - MenuTokenKey.MenuPopupBorderRadius)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Layoutable.MinWidthProperty, - MenuTokenKey.MenuPopupMinWidth)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Layoutable.MaxWidthProperty, - MenuTokenKey.MenuPopupMaxWidth)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Layoutable.MinHeightProperty, - MenuTokenKey.MenuPopupMinHeight)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Layoutable.MaxHeightProperty, - MenuTokenKey.MenuPopupMaxHeight)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Decorator.PaddingProperty, - MenuTokenKey.MenuPopupContentPadding)); + var scrollViewer = new MenuScrollViewer(); var itemsPresenter = new ItemsPresenter @@ -222,13 +231,37 @@ internal class MenuItemTheme : BaseControlTheme popup.Child = border; - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(popup, Popup.MarginToAnchorProperty, - MenuTokenKey.TopLevelItemPopupMarginToAnchor)); - menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(popup, Popup.MaskShadowsProperty, - MenuTokenKey.MenuPopupBoxShadows)); CreateTemplateParentBinding(popup, Avalonia.Controls.Primitives.Popup.IsOpenProperty, Avalonia.Controls.MenuItem.IsSubMenuOpenProperty, BindingMode.TwoWay); + RegisterTokenResourceBindings(menuItem, () => + { + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Border.BackgroundProperty, + SharedTokenKey.ColorBgContainer)); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, + Border.CornerRadiusProperty, + MenuTokenKey.MenuPopupBorderRadius)); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, + Layoutable.MinWidthProperty, + MenuTokenKey.MenuPopupMinWidth)); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, + Layoutable.MaxWidthProperty, + MenuTokenKey.MenuPopupMaxWidth)); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, + Layoutable.MinHeightProperty, + MenuTokenKey.MenuPopupMinHeight)); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, + Layoutable.MaxHeightProperty, + MenuTokenKey.MenuPopupMaxHeight)); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(border, Decorator.PaddingProperty, + MenuTokenKey.MenuPopupContentPadding)); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(popup, + Popup.MarginToAnchorProperty, + MenuTokenKey.TopLevelItemPopupMarginToAnchor)); + menuItem.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(popup, Popup.MaskShadowsProperty, + MenuTokenKey.MenuPopupBoxShadows)); + }); + return popup; } @@ -269,10 +302,11 @@ internal class MenuItemTheme : BaseControlTheme borderStyle.Add(Border.BackgroundProperty, MenuTokenKey.ItemHoverBg); hoverStyle.Add(borderStyle); } - + // 动画设置 { - var isMotionEnabledStyle = new Style(selector => selector.Nesting().PropertyEquals(MenuItem.IsMotionEnabledProperty, true)); + var isMotionEnabledStyle = new Style(selector => + selector.Nesting().PropertyEquals(MenuItem.IsMotionEnabledProperty, true)); var borderStyle = new Style(selector => selector.Nesting().Template().Name(ItemDecoratorPart)); borderStyle.Add(Border.TransitionsProperty, new SetterValueFactory(() => new Transitions() { diff --git a/src/AtomUI.Controls/Popup/Popup.cs b/src/AtomUI.Controls/Popup/Popup.cs index f5db52cc0..f39543677 100644 --- a/src/AtomUI.Controls/Popup/Popup.cs +++ b/src/AtomUI.Controls/Popup/Popup.cs @@ -188,6 +188,12 @@ public class Popup : AvaloniaPopup, { _managedPopupPositioner = managedPopupPositioner.GetManagedPopupPositionerPopup(); } +#if DEBUG + if (popupRoot is TopLevel topLevel) + { + topLevel.AttachDevTools(); + } +#endif } var placementTarget = GetEffectivePlacementTarget(); diff --git a/src/AtomUI.Controls/PopupConfirm/PopupConfirmContainerTheme.cs b/src/AtomUI.Controls/PopupConfirm/PopupConfirmContainerTheme.cs index 8060bfb3f..855ca0d71 100644 --- a/src/AtomUI.Controls/PopupConfirm/PopupConfirmContainerTheme.cs +++ b/src/AtomUI.Controls/PopupConfirm/PopupConfirmContainerTheme.cs @@ -43,13 +43,19 @@ internal class PopupConfirmContainerTheme : BaseControlTheme mainLayout.Children.Add(buttons); var content = BuildContent(popupConfirmContainer, scope); mainLayout.Children.Add(content); - popupConfirmContainer.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(mainLayout, - Layoutable.MinWidthProperty, - PopupConfirmTokenKey.PopupMinWidth)); - popupConfirmContainer.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(mainLayout, - Layoutable.MinHeightProperty, - PopupConfirmTokenKey.PopupMinHeight)); + BuildInstanceStyles(popupConfirmContainer); + + RegisterTokenResourceBindings(popupConfirmContainer, () => + { + popupConfirmContainer.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(mainLayout, + Layoutable.MinWidthProperty, + PopupConfirmTokenKey.PopupMinWidth)); + popupConfirmContainer.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(mainLayout, + Layoutable.MinHeightProperty, + PopupConfirmTokenKey.PopupMinHeight)); + }); + return mainLayout; }); } @@ -120,11 +126,11 @@ internal class PopupConfirmContainerTheme : BaseControlTheme { Name = CancelButtonPart, SizeType = SizeType.Small, + Margin = new Thickness(0), + Width = double.NaN, }; cancelButton.RegisterInNameScope(scope); - popupConfirmContainer.AddTokenBindingDisposable(TokenResourceBinder.CreateTokenBinding(cancelButton, Layoutable.MarginProperty, - PopupConfirmTokenKey.ButtonMargin)); CreateTemplateParentBinding(cancelButton, Button.TextProperty, PopupConfirmContainer.CancelTextProperty); CreateTemplateParentBinding(cancelButton, Visual.IsVisibleProperty, PopupConfirmContainer.IsShowCancelButtonProperty); @@ -134,6 +140,8 @@ internal class PopupConfirmContainerTheme : BaseControlTheme { Name = OkButtonPart, SizeType = SizeType.Small, + Margin = new Thickness(0), + Width = double.NaN, }; okButton.RegisterInNameScope(scope); @@ -191,14 +199,11 @@ internal class PopupConfirmContainerTheme : BaseControlTheme var contentStyle = new Style(selector => selector.Nesting().Template().Name(ContentPart)); contentStyle.Add(Layoutable.MarginProperty, PopupConfirmTokenKey.ContentContainerMargin); commonStyle.Add(contentStyle); - - var okButtonStyle = new Style(selector => selector.Nesting().Template().Name(OkButtonPart)); - okButtonStyle.Add(Layoutable.MarginProperty, PopupConfirmTokenKey.ButtonMargin); - commonStyle.Add(okButtonStyle); - - var cancelButtonStyle = new Style(selector => selector.Nesting().Template().Name(CancelButtonPart)); - cancelButtonStyle.Add(Layoutable.MarginProperty, PopupConfirmTokenKey.ButtonMargin); - commonStyle.Add(cancelButtonStyle); + + var buttonContainerStyle = new Style(selector => selector.Nesting().Template().Name(ButtonLayoutPart)); + buttonContainerStyle.Add(StackPanel.SpacingProperty, PopupConfirmTokenKey.ButtonSpacing); + buttonContainerStyle.Add(StackPanel.MarginProperty, PopupConfirmTokenKey.ButtonContainerMargin); + commonStyle.Add(buttonContainerStyle); Add(commonStyle); } diff --git a/src/AtomUI.Controls/PopupConfirm/PopupConfirmToken.cs b/src/AtomUI.Controls/PopupConfirm/PopupConfirmToken.cs index 72ff06e42..9498bfad2 100644 --- a/src/AtomUI.Controls/PopupConfirm/PopupConfirmToken.cs +++ b/src/AtomUI.Controls/PopupConfirm/PopupConfirmToken.cs @@ -26,7 +26,7 @@ internal class PopupConfirmToken : AbstractControlDesignToken /// /// 按钮的外边距 /// - public Thickness ButtonMargin { get; set; } + public double ButtonSpacing { get; set; } /// /// Icon 外边距 @@ -37,6 +37,11 @@ internal class PopupConfirmToken : AbstractControlDesignToken /// 主内容区域外边距 /// public Thickness ContentContainerMargin { get; set; } + + /// + /// 按钮内容区域外边距 + /// + public Thickness ButtonContainerMargin { get; set; } /// /// 标题栏外边距 @@ -48,10 +53,11 @@ internal class PopupConfirmToken : AbstractControlDesignToken base.CalculateFromAlias(); PopupMinWidth = 240; PopupMinHeight = 80; - ButtonMargin = new Thickness(SharedToken.MarginXS, 0, 0, 0); + ButtonSpacing = SharedToken.MarginXS; IconMargin = new Thickness(SharedToken.MarginXS, SharedToken.MarginXS + SharedToken.MarginXXS / 2, SharedToken.MarginXS, 0); ContentContainerMargin = new Thickness(0, 0, 0, SharedToken.MarginXS); TitleMargin = new Thickness(0, SharedToken.MarginXS, 0, SharedToken.MarginXS); + ButtonContainerMargin = new Thickness(0, SharedToken.MarginXS, 0, 0); } } \ No newline at end of file diff --git a/src/AtomUI.Theme/BaseControlTheme.cs b/src/AtomUI.Theme/BaseControlTheme.cs index 796f1a72c..f990d0974 100644 --- a/src/AtomUI.Theme/BaseControlTheme.cs +++ b/src/AtomUI.Theme/BaseControlTheme.cs @@ -4,6 +4,7 @@ using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; using Avalonia.Data; using Avalonia.Data.Converters; +using Avalonia.LogicalTree; using Avalonia.Styling; namespace AtomUI.Theme; @@ -66,6 +67,18 @@ public abstract class BaseControlTheme : ControlTheme { } + protected static void RegisterTokenResourceBindings(Control hostControl, Action resourceBindingAction) + { + if (((ILogical)hostControl).IsAttachedToLogicalTree) + { + resourceBindingAction(); + } + hostControl.AttachedToLogicalTree += (sender, args) => + { + resourceBindingAction(); + }; + } + protected static IDisposable CreateTemplateParentBinding( AvaloniaObject target, StyledProperty property,