From e23b2ffc871c8d74d0625e1e80e78dfdb34b072d Mon Sep 17 00:00:00 2001 From: polarboy Date: Wed, 7 Aug 2024 11:08:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20lineedit=20=E5=B8=83?= =?UTF-8?q?=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化 lineedit 布局 --- .../TokenResourceConst.g.cs | 2 + src/AtomUI.Controls/Input/LineEdit.cs | 90 ++++++----- src/AtomUI.Controls/Input/LineEditKernel.cs | 92 ++++++----- src/AtomUI.Controls/Input/LineEditTheme.cs | 147 +++++++++++------- src/AtomUI.Controls/Input/LineEditToken.cs | 13 ++ 5 files changed, 219 insertions(+), 125 deletions(-) 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 7f487f4c9..884a136e6 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 @@ -119,6 +119,8 @@ namespace AtomUI.Theme.Styling public static readonly TokenResourceKey AddOnPadding = new TokenResourceKey("LineEdit.AddOnPadding"); public static readonly TokenResourceKey AddOnPaddingSM = new TokenResourceKey("LineEdit.AddOnPaddingSM"); public static readonly TokenResourceKey AddOnPaddingLG = new TokenResourceKey("LineEdit.AddOnPaddingLG"); + public static readonly TokenResourceKey LeftInnerAddOnMargin = new TokenResourceKey("LineEdit.LeftInnerAddOnMargin"); + public static readonly TokenResourceKey RightInnerAddOnMargin = new TokenResourceKey("LineEdit.RightInnerAddOnMargin"); } public static class LoadingIndicatorResourceKey diff --git a/src/AtomUI.Controls/Input/LineEdit.cs b/src/AtomUI.Controls/Input/LineEdit.cs index eb074c32e..766142b73 100644 --- a/src/AtomUI.Controls/Input/LineEdit.cs +++ b/src/AtomUI.Controls/Input/LineEdit.cs @@ -7,6 +7,7 @@ using Avalonia.Controls; using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; using Avalonia.Data; +using Avalonia.Input; namespace AtomUI.Controls; @@ -80,36 +81,54 @@ public class LineEdit : TextBox internal static readonly StyledProperty EditKernelCornerRadiusProperty = AvaloniaProperty.Register(nameof(EditKernelCornerRadius)); + internal static readonly StyledProperty LeftAddOnCornerRadiusProperty = + AvaloniaProperty.Register(nameof(LeftAddOnCornerRadius)); + + internal static readonly StyledProperty RightAddOnCornerRadiusProperty = + AvaloniaProperty.Register(nameof(RightAddOnCornerRadius)); + + internal static readonly StyledProperty LeftAddOnBorderThicknessProperty = + AvaloniaProperty.Register(nameof(LeftAddOnBorderThickness)); + + internal static readonly StyledProperty RightAddOnBorderThicknessProperty = + AvaloniaProperty.Register(nameof(RightAddOnBorderThickness)); + internal CornerRadius EditKernelCornerRadius { get => GetValue(EditKernelCornerRadiusProperty); set => SetValue(EditKernelCornerRadiusProperty, value); } - internal static readonly StyledProperty LeftAddOnCornerRadiusProperty = - AvaloniaProperty.Register(nameof(LeftAddOnCornerRadius)); - internal CornerRadius LeftAddOnCornerRadius { get => GetValue(LeftAddOnCornerRadiusProperty); set => SetValue(LeftAddOnCornerRadiusProperty, value); } - internal static readonly StyledProperty RightAddOnCornerRadiusProperty = - AvaloniaProperty.Register(nameof(RightAddOnCornerRadius)); - internal CornerRadius RightAddOnCornerRadius { get => GetValue(RightAddOnCornerRadiusProperty); set => SetValue(RightAddOnCornerRadiusProperty, value); } + internal Thickness LeftAddOnBorderThickness + { + get => GetValue(LeftAddOnBorderThicknessProperty); + set => SetValue(LeftAddOnBorderThicknessProperty, value); + } + + internal Thickness RightAddOnBorderThickness + { + get => GetValue(RightAddOnBorderThicknessProperty); + set => SetValue(RightAddOnBorderThicknessProperty, value); + } + #endregion private readonly BorderRenderHelper _borderRenderHelper; private ContentPresenter? _leftAddOnPresenter; private ContentPresenter? _rightAddOnPresenter; - private LineEditKernel? _lineEditKernel; + private Border? _lineEditKernelDecorator; static LineEdit() @@ -130,7 +149,7 @@ public class LineEdit : TextBox BindingPriority.Template, new RenderScaleAwareThicknessConfigure(this)); _leftAddOnPresenter = e.NameScope.Find(LineEditTheme.LeftAddOnPart); _rightAddOnPresenter = e.NameScope.Find(LineEditTheme.RightAddOnPart); - _lineEditKernel = e.NameScope.Find(LineEditTheme.LineEditKernelPart); + _lineEditKernelDecorator = e.NameScope.Find(LineEditTheme.LineEditKernelDecoratorPart); SetupEditKernelCornerRadius(); } @@ -144,17 +163,22 @@ public class LineEdit : TextBox } } - if (change.Property == CornerRadiusProperty) { - SetupAddOnCornerRadius(); + if (change.Property == CornerRadiusProperty || change.Property == BorderThicknessProperty) { + SetupAddOnBorderInfo(); } } - private void SetupAddOnCornerRadius() + private void SetupAddOnBorderInfo() { var topLeftRadius = CornerRadius.TopLeft; var topRightRadius = CornerRadius.TopRight; var bottomLeftRadius = CornerRadius.BottomLeft; var bottomRightRadius = CornerRadius.BottomRight; + + var topThickness = BorderThickness.Top; + var rightThickness = BorderThickness.Right; + var bottomThickness = BorderThickness.Bottom; + var leftThickness = BorderThickness.Left; LeftAddOnCornerRadius = new CornerRadius(topLeft: topLeftRadius, topRight: 0, @@ -164,6 +188,9 @@ public class LineEdit : TextBox topRight: topRightRadius, bottomLeft:0, bottomRight:bottomRightRadius); + + LeftAddOnBorderThickness = new Thickness(top: topThickness, right:0, bottom:bottomThickness, left: leftThickness); + RightAddOnBorderThickness = new Thickness(top: topThickness, right:rightThickness, bottom:bottomThickness, left: 0); } private void SetupEditKernelCornerRadius() @@ -188,34 +215,25 @@ public class LineEdit : TextBox bottomRight:bottomRightRadius); } + protected override Size MeasureOverride(Size availableSize) + { + return base.MeasureOverride(new Size(availableSize.Width - BorderThickness.Left - BorderThickness.Right, availableSize.Height)); + } + protected override Size ArrangeOverride(Size finalSize) { - var offsetLeft = 0d; - var offsetRight = finalSize.Width; - var controlRect = new Rect(new Point(0, 0), finalSize); - if (_leftAddOnPresenter is not null && _leftAddOnPresenter.IsVisible) { - offsetLeft += _leftAddOnPresenter.DesiredSize.Width - BorderThickness.Left; - _leftAddOnPresenter.Arrange(controlRect); + return base.ArrangeOverride(new Size(finalSize.Width - BorderThickness.Left - BorderThickness.Right, finalSize.Height)); + } + + protected override void OnPointerPressed(PointerPressedEventArgs e) + { + if (_lineEditKernelDecorator is null) { + return; } - - if (_rightAddOnPresenter is not null && _rightAddOnPresenter.IsVisible) { - offsetRight -= _rightAddOnPresenter.DesiredSize.Width - BorderThickness.Right; - _rightAddOnPresenter.Arrange(controlRect); + var targetRect = new Rect(_lineEditKernelDecorator.DesiredSize); + if (!targetRect.Contains(e.GetPosition(_lineEditKernelDecorator))) { + return; } - - if (_lineEditKernel is not null) { - var width = offsetRight - offsetLeft; - if (_leftAddOnPresenter is not null && _leftAddOnPresenter.IsVisible) { - offsetLeft -= BorderThickness.Left; - width += BorderThickness.Left; - } - - if (_rightAddOnPresenter is not null && _rightAddOnPresenter.IsVisible) { - width += BorderThickness.Right; - } - _lineEditKernel.Arrange(new Rect(new Point(offsetLeft, 0), new Size(width, finalSize.Height))); - } - - return finalSize; + base.OnPointerPressed(e); } } \ No newline at end of file diff --git a/src/AtomUI.Controls/Input/LineEditKernel.cs b/src/AtomUI.Controls/Input/LineEditKernel.cs index 77af3f7b5..bf0e025b5 100644 --- a/src/AtomUI.Controls/Input/LineEditKernel.cs +++ b/src/AtomUI.Controls/Input/LineEditKernel.cs @@ -4,10 +4,11 @@ using Avalonia; using Avalonia.Animation; using Avalonia.Controls; using Avalonia.Controls.Presenters; +using Avalonia.Layout; namespace AtomUI.Controls; -internal class LineEditKernel : Border +internal class LineEditKernel : Panel { #region 公共属性定义 public static readonly DirectProperty LeftInnerContentProperty = @@ -81,12 +82,8 @@ internal class LineEditKernel : Border TextPresenterProperty); } - private Panel _layout; - public LineEditKernel() { - _layout = new Panel(); - Child = _layout; Focusable = true; } @@ -96,95 +93,116 @@ internal class LineEditKernel : Border if (change.Property == LeftInnerContentProperty) { var oldLeftInnerContent = change.GetOldValue(); if (oldLeftInnerContent is not null) { - _layout.Children.Remove(oldLeftInnerContent); + Children.Remove(oldLeftInnerContent); } if (LeftInnerContent is not null) { - _layout.Children.Add(LeftInnerContent); + Children.Add(LeftInnerContent); } } else if (change.Property == RightInnerContentProperty) { var oldRightInnerContent = change.GetOldValue(); if (oldRightInnerContent is not null) { - _layout.Children.Remove(oldRightInnerContent); + Children.Remove(oldRightInnerContent); } if (RightInnerContent is not null) { - _layout.Children.Add(RightInnerContent); + Children.Add(RightInnerContent); } } else if (change.Property == ClearButtonProperty) { var oldClearButton = change.GetOldValue(); if (oldClearButton is not null) { - _layout.Children.Remove(oldClearButton); + Children.Remove(oldClearButton); } if (ClearButton is not null) { - _layout.Children.Add(ClearButton); + Children.Add(ClearButton); } } else if (change.Property == RevealButtonProperty) { var oldRevealButton = change.GetOldValue(); if (oldRevealButton is not null) { - _layout.Children.Remove(oldRevealButton); + Children.Remove(oldRevealButton); } if (RevealButton is not null) { - _layout.Children.Add(RevealButton); + Children.Add(RevealButton); } } else if (change.Property == TextPresenterProperty) { var oldTextPresenter = change.GetOldValue(); if (oldTextPresenter is not null) { - _layout.Children.Remove(oldTextPresenter); + Children.Remove(oldTextPresenter); } if (TextPresenter is not null) { - _layout.Children.Add(TextPresenter); + Children.Add(TextPresenter); } } } protected override Size MeasureOverride(Size availableSize) { - var size = base.MeasureOverride(availableSize); - return new Size(availableSize.Width, size.Height); + // 不考虑任何 border 和 Padding,外层的 Decorator 已经考虑 + var height = 0d; + var remainWidth = availableSize.Width; + if (LeftInnerContent is not null && LeftInnerContent.IsVisible) { + LeftInnerContent.Measure(availableSize); + height = Math.Max(height, LeftInnerContent.DesiredSize.Height); + remainWidth -= LeftInnerContent.DesiredSize.Width; + } + + if (RightInnerContent is not null && RightInnerContent.IsVisible) { + RightInnerContent.Measure(availableSize); + height = Math.Max(height, RightInnerContent.DesiredSize.Height); + remainWidth -= RightInnerContent.DesiredSize.Width; + } + + if (RevealButton is not null && RevealButton.IsVisible) { + RevealButton.Measure(availableSize); + height = Math.Max(height, RevealButton.DesiredSize.Height); + remainWidth -= RevealButton.DesiredSize.Width; + } + + if (ClearButton is not null && ClearButton.IsVisible) { + ClearButton.Measure(availableSize); + height = Math.Max(height, ClearButton.DesiredSize.Height); + remainWidth -= ClearButton.DesiredSize.Width; + } + + if (TextPresenter is not null && TextPresenter.IsVisible) { + TextPresenter.Measure(new Size(remainWidth, availableSize.Height)); + height = Math.Max(height, TextPresenter.DesiredSize.Height); + } + + return new Size(availableSize.Width, height); } protected override Size ArrangeOverride(Size finalSize) { - var offsetLeft = Padding.Left; - if (LeftInnerContent is not null) { + var offsetLeft = 0d; + if (LeftInnerContent is not null && LeftInnerContent.IsVisible) { offsetLeft += LeftInnerContent.DesiredSize.Width; LeftInnerContent.Arrange(new Rect(new Point(offsetLeft, (finalSize.Height - LeftInnerContent.DesiredSize.Height) / 2), LeftInnerContent.DesiredSize)); } - - var offsetRight = finalSize.Width - Padding.Right; - if (RightInnerContent is not null) { + + var offsetRight = finalSize.Width; + if (RightInnerContent is not null && RightInnerContent.IsVisible) { offsetRight -= RightInnerContent.DesiredSize.Width; RightInnerContent.Arrange(new Rect(new Point(offsetRight, (finalSize.Height - RightInnerContent.DesiredSize.Height) / 2), RightInnerContent.DesiredSize)); } - if (RevealButton is not null) { + if (RevealButton is not null && RevealButton.IsVisible) { offsetRight -= RevealButton.DesiredSize.Width; RevealButton.Arrange(new Rect(new Point(offsetRight, (finalSize.Height - RevealButton.DesiredSize.Height) / 2), RevealButton.DesiredSize)); } - if (ClearButton is not null) { + if (ClearButton is not null && ClearButton.IsVisible) { offsetRight -= ClearButton.DesiredSize.Width; ClearButton.Arrange(new Rect(new Point(offsetRight, (finalSize.Height - ClearButton.DesiredSize.Height) / 2), ClearButton.DesiredSize)); } - - if (TextPresenter is not null) { + + if (TextPresenter is not null && TextPresenter.IsVisible) { TextPresenter.Arrange(new Rect(new Point(offsetLeft, 0), new Size(offsetRight - offsetLeft, finalSize.Height))); } - return new Size(finalSize.Width - BorderThickness.Left - BorderThickness.Right, finalSize.Height); - } - - public override void ApplyTemplate() - { - base.ApplyTemplate(); - if (Transitions is null) { - Transitions = new Transitions(); - Transitions.Add(AnimationUtils.CreateTransition(BorderBrushProperty)); - Transitions.Add(AnimationUtils.CreateTransition(BackgroundProperty)); - } + return new Size(finalSize.Width, finalSize.Height); } } \ No newline at end of file diff --git a/src/AtomUI.Controls/Input/LineEditTheme.cs b/src/AtomUI.Controls/Input/LineEditTheme.cs index 426190ea2..ccab320be 100644 --- a/src/AtomUI.Controls/Input/LineEditTheme.cs +++ b/src/AtomUI.Controls/Input/LineEditTheme.cs @@ -1,12 +1,14 @@ using AtomUI.Data; +using AtomUI.Media; using AtomUI.Theme; using AtomUI.Theme.Data; using AtomUI.Theme.Styling; using AtomUI.Theme.Utils; using AtomUI.Utils; +using Avalonia; +using Avalonia.Animation; using Avalonia.Controls; using Avalonia.Controls.Presenters; -using Avalonia.Controls.Shapes; using Avalonia.Controls.Templates; using Avalonia.Data; using Avalonia.Data.Converters; @@ -19,17 +21,18 @@ namespace AtomUI.Controls; [ControlThemeProvider] internal class LineEditTheme : BaseControlTheme { - public const string MainLayoutPart = "PART_FrameDecorator"; - public const string TextPresenterPart = "PART_TextPresenter"; - public const string WatermarkPart = "PART_Watermark"; - public const string ScrollViewerPart = "PART_ScrollViewer"; - public const string LeftAddOnPart = "PART_LeftAddOn"; - public const string RightAddOnPart = "PART_RightAddOn"; - public const string LeftInnerContentPart = "PART_LeftInnerContent"; - public const string RightInnerContentPart = "PART_RightInnerContent"; - public const string ClearButtonPart = "PART_ClearButton"; - public const string RevealButtonPart = "PART_RevealButton"; - public const string LineEditKernelPart = "PART_LineEditKernel"; + public const string MainLayoutPart = "PART_FrameDecorator"; + public const string TextPresenterPart = "PART_TextPresenter"; + public const string WatermarkPart = "PART_Watermark"; + public const string ScrollViewerPart = "PART_ScrollViewer"; + public const string LeftAddOnPart = "PART_LeftAddOn"; + public const string RightAddOnPart = "PART_RightAddOn"; + public const string LeftInnerContentPart = "PART_LeftInnerContent"; + public const string RightInnerContentPart = "PART_RightInnerContent"; + public const string ClearButtonPart = "PART_ClearButton"; + public const string RevealButtonPart = "PART_RevealButton"; + public const string LineEditKernelPart = "PART_LineEditKernel"; + public const string LineEditKernelDecoratorPart = "PART_LineEditKernelDecorator"; public LineEditTheme() : base(typeof(LineEdit)) { } @@ -37,23 +40,29 @@ internal class LineEditTheme : BaseControlTheme { return new FuncControlTemplate((lineEdit, scope) => { - var mainLayout = new Panel() + var mainLayout = new Grid() { - Name = MainLayoutPart + Name = MainLayoutPart, + ColumnDefinitions = new ColumnDefinitions() + { + new ColumnDefinition(GridLength.Auto), + new ColumnDefinition(GridLength.Star), + new ColumnDefinition(GridLength.Auto) + } }; BuildGridChildren(lineEdit, mainLayout, scope); return mainLayout; }); } - protected virtual void BuildGridChildren(LineEdit lineEdit, Panel layout, INameScope scope) + protected virtual void BuildGridChildren(LineEdit lineEdit, Grid layout, INameScope scope) { BuildLeftAddOn(layout, scope); BuildLineEditKernel(lineEdit, layout, scope); BuildRightAddOn(layout, scope); } - protected virtual void BuildLeftAddOn(Panel layout, INameScope scope) + protected virtual void BuildLeftAddOn(Grid layout, INameScope scope) { var leftAddOnContentPresenter = new ContentPresenter() { @@ -65,7 +74,7 @@ internal class LineEditTheme : BaseControlTheme }; CreateTemplateParentBinding(leftAddOnContentPresenter, ContentPresenter.ContentProperty, LineEdit.LeftAddOnProperty); - CreateTemplateParentBinding(leftAddOnContentPresenter, ContentPresenter.BorderThicknessProperty, LineEdit.BorderThicknessProperty); + CreateTemplateParentBinding(leftAddOnContentPresenter, ContentPresenter.BorderThicknessProperty, LineEdit.LeftAddOnBorderThicknessProperty); CreateTemplateParentBinding(leftAddOnContentPresenter, ContentPresenter.CornerRadiusProperty, LineEdit.LeftAddOnCornerRadiusProperty); CreateTemplateParentBinding(leftAddOnContentPresenter, ContentPresenter.IsVisibleProperty, LineEdit.LeftAddOnProperty, BindingMode.Default, ObjectConverters.IsNotNull); @@ -78,8 +87,20 @@ internal class LineEditTheme : BaseControlTheme layout.Children.Add(leftAddOnContentPresenter); } - protected virtual void BuildLineEditKernel(LineEdit lineEdit, Panel layout, INameScope scope) + protected virtual void BuildLineEditKernel(LineEdit lineEdit, Grid layout, INameScope scope) { + var kernelDecorator = new Border() + { + Name = LineEditKernelDecoratorPart, + Transitions = new Transitions() + { + AnimationUtils.CreateTransition(Border.BorderBrushProperty), + AnimationUtils.CreateTransition(Border.BackgroundProperty) + } + }; + + kernelDecorator.RegisterInNameScope(scope); + var kernelLayout = new LineEditKernel() { Name = LineEditKernelPart, @@ -87,19 +108,21 @@ internal class LineEditTheme : BaseControlTheme Cursor = new Cursor(StandardCursorType.Ibeam) }; - CreateTemplateParentBinding(kernelLayout, LineEditKernel.BorderThicknessProperty, LineEdit.BorderThicknessProperty); - CreateTemplateParentBinding(kernelLayout, LineEditKernel.CornerRadiusProperty, LineEdit.EditKernelCornerRadiusProperty); + CreateTemplateParentBinding(kernelDecorator, Border.BorderThicknessProperty, LineEdit.BorderThicknessProperty); + CreateTemplateParentBinding(kernelDecorator, Border.CornerRadiusProperty, LineEdit.EditKernelCornerRadiusProperty); BuildInnerLeftContent(kernelLayout, scope); BuildTextPresenter(lineEdit, kernelLayout, scope); BuildClearButton(kernelLayout, scope); BuildRevealButton(kernelLayout, scope); BuildInnerRightContent(kernelLayout, scope); - layout.Children.Add(kernelLayout); - kernelLayout.RegisterInNameScope(scope); + + kernelDecorator.Child = kernelLayout; + layout.Children.Add(kernelDecorator); + Grid.SetColumn(kernelDecorator, 1); } - protected virtual void BuildRightAddOn(Panel layout, INameScope scope) + protected virtual void BuildRightAddOn(Grid layout, INameScope scope) { var rightAddOnContentPresenter = new ContentPresenter() { @@ -110,7 +133,7 @@ internal class LineEditTheme : BaseControlTheme Focusable = false }; CreateTemplateParentBinding(rightAddOnContentPresenter, ContentPresenter.ContentProperty, LineEdit.RightAddOnProperty); - CreateTemplateParentBinding(rightAddOnContentPresenter, ContentPresenter.BorderThicknessProperty, LineEdit.BorderThicknessProperty); + CreateTemplateParentBinding(rightAddOnContentPresenter, ContentPresenter.BorderThicknessProperty, LineEdit.RightAddOnBorderThicknessProperty); CreateTemplateParentBinding(rightAddOnContentPresenter, ContentPresenter.CornerRadiusProperty, LineEdit.RightAddOnCornerRadiusProperty); CreateTemplateParentBinding(rightAddOnContentPresenter, ContentPresenter.IsVisibleProperty, LineEdit.RightAddOnProperty, BindingMode.Default, ObjectConverters.IsNotNull); @@ -120,6 +143,7 @@ internal class LineEditTheme : BaseControlTheme rightAddOnContentPresenter.RegisterInNameScope(scope); layout.Children.Add(rightAddOnContentPresenter); + Grid.SetColumn(rightAddOnContentPresenter, 2); } protected virtual void BuildInnerLeftContent(LineEditKernel layout, INameScope scope) @@ -214,7 +238,8 @@ internal class LineEditTheme : BaseControlTheme { var clearButton = new IconButton() { - Name = ClearButtonPart + Name = ClearButtonPart, + IsVisible = false }; clearButton.RegisterInNameScope(scope); layout.ClearButton = clearButton; @@ -224,7 +249,8 @@ internal class LineEditTheme : BaseControlTheme { var revealButton = new ToggleIconButton() { - Name = RevealButtonPart + Name = RevealButtonPart, + IsVisible = false }; revealButton.RegisterInNameScope(scope); layout.RevealButton = revealButton; @@ -253,11 +279,28 @@ internal class LineEditTheme : BaseControlTheme var commonStyle = new Style(selector => selector.Nesting()); commonStyle.Add(LineEdit.ForegroundProperty, GlobalResourceKey.ColorText); + // 输入框左右小组件的 margin 设置 + var leftInnerContentStyle = new Style(selector => selector.Nesting().Template().Name(LeftInnerContentPart)); + leftInnerContentStyle.Add(ContentPresenter.PaddingProperty, LineEditResourceKey.LeftInnerAddOnMargin); + commonStyle.Add(leftInnerContentStyle); + + var rightInnerContentStyle = new Style(selector => selector.Nesting().Template().Name(RightInnerContentPart)); + rightInnerContentStyle.Add(ContentPresenter.PaddingProperty, LineEditResourceKey.RightInnerAddOnMargin); + commonStyle.Add(rightInnerContentStyle); + + var clearButtonStyle = new Style(selector => selector.Nesting().Template().Name(ClearButtonPart)); + clearButtonStyle.Add(IconButton.PaddingProperty, LineEditResourceKey.RightInnerAddOnMargin); + commonStyle.Add(clearButtonStyle); + + var revealButtonStyle = new Style(selector => selector.Nesting().Template().Name(RevealButtonPart)); + revealButtonStyle.Add(ToggleIconButton.PaddingProperty, LineEditResourceKey.RightInnerAddOnMargin); + commonStyle.Add(revealButtonStyle); + var largeStyle = new Style(selector => selector.Nesting().PropertyEquals(LineEdit.SizeTypeProperty, SizeType.Large)); { - var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); - editKernelStyle.Add(LineEditKernel.PaddingProperty, LineEditResourceKey.PaddingLG); - largeStyle.Add(editKernelStyle); + var editKernelDecoratorStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelDecoratorPart)); + editKernelDecoratorStyle.Add(Border.PaddingProperty, LineEditResourceKey.PaddingLG); + largeStyle.Add(editKernelDecoratorStyle); } { @@ -274,9 +317,9 @@ internal class LineEditTheme : BaseControlTheme var middleStyle = new Style(selector => selector.Nesting().PropertyEquals(LineEdit.SizeTypeProperty, SizeType.Middle)); { - var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); - editKernelStyle.Add(LineEditKernel.PaddingProperty, LineEditResourceKey.Padding); - middleStyle.Add(editKernelStyle); + var editKernelDecoratorStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelDecoratorPart)); + editKernelDecoratorStyle.Add(Border.PaddingProperty, LineEditResourceKey.Padding); + middleStyle.Add(editKernelDecoratorStyle); } { @@ -293,9 +336,9 @@ internal class LineEditTheme : BaseControlTheme var smallStyle = new Style(selector => selector.Nesting().PropertyEquals(LineEdit.SizeTypeProperty, SizeType.Small)); { - var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); - editKernelStyle.Add(LineEditKernel.PaddingProperty, LineEditResourceKey.PaddingSM); - smallStyle.Add(editKernelStyle); + var editKernelDecoratorStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelDecoratorPart)); + editKernelDecoratorStyle.Add(Border.PaddingProperty, LineEditResourceKey.PaddingSM); + smallStyle.Add(editKernelDecoratorStyle); } { @@ -316,18 +359,18 @@ internal class LineEditTheme : BaseControlTheme { var outlineStyle = new Style(selector => selector.Nesting().PropertyEquals(LineEdit.StyleVariantProperty, TextBoxVariant.Outline)); - var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); - editKernelStyle.Add(LineEditKernel.BorderBrushProperty, GlobalResourceKey.ColorBorder); + var editKernelDecoratorStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelDecoratorPart)); + editKernelDecoratorStyle.Add(Border.BorderBrushProperty, GlobalResourceKey.ColorBorder); var hoverStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.PointerOver)); - hoverStyle.Add(LineEditKernel.BorderBrushProperty, LineEditResourceKey.HoverBorderColor); - editKernelStyle.Add(hoverStyle); + hoverStyle.Add(Border.BorderBrushProperty, LineEditResourceKey.HoverBorderColor); + editKernelDecoratorStyle.Add(hoverStyle); var focusStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.FocusWithIn)); - focusStyle.Add(LineEditKernel.BorderBrushProperty, LineEditResourceKey.ActiveBorderColor); - editKernelStyle.Add(focusStyle); + focusStyle.Add(Border.BorderBrushProperty, LineEditResourceKey.ActiveBorderColor); + editKernelDecoratorStyle.Add(focusStyle); - outlineStyle.Add(editKernelStyle); + outlineStyle.Add(editKernelDecoratorStyle); Add(outlineStyle); } @@ -336,22 +379,22 @@ internal class LineEditTheme : BaseControlTheme var filledStyle = new Style(selector => selector.Nesting().PropertyEquals(LineEdit.StyleVariantProperty, TextBoxVariant.Filled)); - var editKernelStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelPart)); + var editKernelDecoratorStyle = new Style(selector => selector.Nesting().Template().Name(LineEditKernelDecoratorPart)); - editKernelStyle.Add(LineEditKernel.BorderBrushProperty, GlobalResourceKey.ColorTransparent); - editKernelStyle.Add(LineEditKernel.BackgroundProperty, GlobalResourceKey.ColorFillTertiary); - filledStyle.Add(editKernelStyle); + editKernelDecoratorStyle.Add(Border.BorderBrushProperty, GlobalResourceKey.ColorTransparent); + editKernelDecoratorStyle.Add(Border.BackgroundProperty, GlobalResourceKey.ColorFillTertiary); + filledStyle.Add(editKernelDecoratorStyle); var hoverStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.PointerOver)); - hoverStyle.Add(LineEditKernel.BackgroundProperty, GlobalResourceKey.ColorFillSecondary); - editKernelStyle.Add(hoverStyle); + hoverStyle.Add(Border.BackgroundProperty, GlobalResourceKey.ColorFillSecondary); + editKernelDecoratorStyle.Add(hoverStyle); var focusStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.FocusWithIn)); - focusStyle.Add(LineEditKernel.BorderBrushProperty, LineEditResourceKey.ActiveBorderColor); - focusStyle.Add(LineEditKernel.BackgroundProperty, LineEditResourceKey.ActiveBg); - editKernelStyle.Add(focusStyle); + focusStyle.Add(Border.BorderBrushProperty, LineEditResourceKey.ActiveBorderColor); + focusStyle.Add(Border.BackgroundProperty, LineEditResourceKey.ActiveBg); + editKernelDecoratorStyle.Add(focusStyle); - filledStyle.Add(editKernelStyle); + filledStyle.Add(editKernelDecoratorStyle); Add(filledStyle); } diff --git a/src/AtomUI.Controls/Input/LineEditToken.cs b/src/AtomUI.Controls/Input/LineEditToken.cs index e096a3cc0..d8b1e133b 100644 --- a/src/AtomUI.Controls/Input/LineEditToken.cs +++ b/src/AtomUI.Controls/Input/LineEditToken.cs @@ -98,6 +98,16 @@ internal class LineEditToken : AbstractControlDesignToken /// AddOn 大号内边距 /// public Thickness AddOnPaddingLG { get; set; } + + /// + /// 左边内部小组件的边距 + /// + public Thickness LeftInnerAddOnMargin { get; set; } + + /// + /// 右边内部小组件的边距 + /// + public Thickness RightInnerAddOnMargin { get; set; } internal override void CalculateFromAlias() { @@ -140,5 +150,8 @@ internal class LineEditToken : AbstractControlDesignToken InputFontSize = _globalToken.FontToken.FontSize; InputFontSizeLG = _globalToken.FontToken.FontSizeLG; InputFontSizeSM = _globalToken.FontToken.FontSizeSM; + + LeftInnerAddOnMargin = new Thickness(0, 0, _globalToken.MarginXXS, 0); + RightInnerAddOnMargin = new Thickness(_globalToken.MarginXXS, 0, 0, 0); } } \ No newline at end of file