mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-26 03:00:28 +08:00
Fix MenuItem style token bindings
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
+2
-1
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user