Fix MenuItem style token bindings

This commit is contained in:
chinboy
2025-03-03 11:55:13 +08:00
parent 7b6bc01f96
commit 7a8438fc5d
10 changed files with 202 additions and 135 deletions
+46 -51
View File
@@ -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();
@@ -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
{
@@ -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");
}
+18 -14
View File
@@ -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
+1 -2
View File
@@ -83,8 +83,6 @@ public class MenuItem : AvaloniaMenuItem,
{
_togglePresenter = scope.Find<ContentControl>(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)
+71 -37
View File
@@ -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<Transitions>(() => new Transitions()
{
+6
View File
@@ -188,6 +188,12 @@ public class Popup : AvaloniaPopup,
{
_managedPopupPositioner = managedPopupPositioner.GetManagedPopupPositionerPopup();
}
#if DEBUG
if (popupRoot is TopLevel topLevel)
{
topLevel.AttachDevTools();
}
#endif
}
var placementTarget = GetEffectivePlacementTarget();
@@ -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);
}
@@ -26,7 +26,7 @@ internal class PopupConfirmToken : AbstractControlDesignToken
/// <summary>
/// 按钮的外边距
/// </summary>
public Thickness ButtonMargin { get; set; }
public double ButtonSpacing { get; set; }
/// <summary>
/// Icon 外边距
@@ -37,6 +37,11 @@ internal class PopupConfirmToken : AbstractControlDesignToken
/// 主内容区域外边距
/// </summary>
public Thickness ContentContainerMargin { get; set; }
/// <summary>
/// 按钮内容区域外边距
/// </summary>
public Thickness ButtonContainerMargin { get; set; }
/// <summary>
/// 标题栏外边距
@@ -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);
}
}
+13
View File
@@ -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<T>(
AvaloniaObject target,
StyledProperty<T> property,