mirror of
https://gitee.com/chinware/atomui.git
synced 2024-11-29 18:38:16 +08:00
优化 lineedit 布局
优化 lineedit 布局
This commit is contained in:
parent
c8e3e7badc
commit
e23b2ffc87
@ -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
|
||||
|
@ -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<CornerRadius> EditKernelCornerRadiusProperty =
|
||||
AvaloniaProperty.Register<LineEdit, CornerRadius>(nameof(EditKernelCornerRadius));
|
||||
|
||||
internal static readonly StyledProperty<CornerRadius> LeftAddOnCornerRadiusProperty =
|
||||
AvaloniaProperty.Register<LineEdit, CornerRadius>(nameof(LeftAddOnCornerRadius));
|
||||
|
||||
internal static readonly StyledProperty<CornerRadius> RightAddOnCornerRadiusProperty =
|
||||
AvaloniaProperty.Register<LineEdit, CornerRadius>(nameof(RightAddOnCornerRadius));
|
||||
|
||||
internal static readonly StyledProperty<Thickness> LeftAddOnBorderThicknessProperty =
|
||||
AvaloniaProperty.Register<LineEdit, Thickness>(nameof(LeftAddOnBorderThickness));
|
||||
|
||||
internal static readonly StyledProperty<Thickness> RightAddOnBorderThicknessProperty =
|
||||
AvaloniaProperty.Register<LineEdit, Thickness>(nameof(RightAddOnBorderThickness));
|
||||
|
||||
internal CornerRadius EditKernelCornerRadius
|
||||
{
|
||||
get => GetValue(EditKernelCornerRadiusProperty);
|
||||
set => SetValue(EditKernelCornerRadiusProperty, value);
|
||||
}
|
||||
|
||||
internal static readonly StyledProperty<CornerRadius> LeftAddOnCornerRadiusProperty =
|
||||
AvaloniaProperty.Register<LineEdit, CornerRadius>(nameof(LeftAddOnCornerRadius));
|
||||
|
||||
internal CornerRadius LeftAddOnCornerRadius
|
||||
{
|
||||
get => GetValue(LeftAddOnCornerRadiusProperty);
|
||||
set => SetValue(LeftAddOnCornerRadiusProperty, value);
|
||||
}
|
||||
|
||||
internal static readonly StyledProperty<CornerRadius> RightAddOnCornerRadiusProperty =
|
||||
AvaloniaProperty.Register<LineEdit, CornerRadius>(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<ContentPresenter>(LineEditTheme.LeftAddOnPart);
|
||||
_rightAddOnPresenter = e.NameScope.Find<ContentPresenter>(LineEditTheme.RightAddOnPart);
|
||||
_lineEditKernel = e.NameScope.Find<LineEditKernel>(LineEditTheme.LineEditKernelPart);
|
||||
_lineEditKernelDecorator = e.NameScope.Find<Border>(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);
|
||||
}
|
||||
}
|
@ -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<LineEditKernel, ContentPresenter?> 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<ContentPresenter?>();
|
||||
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<ContentPresenter?>();
|
||||
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<IconButton?>();
|
||||
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<ToggleIconButton?>();
|
||||
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<ScrollViewer?>();
|
||||
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<SolidColorBrushTransition>(BorderBrushProperty));
|
||||
Transitions.Add(AnimationUtils.CreateTransition<SolidColorBrushTransition>(BackgroundProperty));
|
||||
}
|
||||
return new Size(finalSize.Width, finalSize.Height);
|
||||
}
|
||||
}
|
@ -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>((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<SolidColorBrushTransition>(Border.BorderBrushProperty),
|
||||
AnimationUtils.CreateTransition<SolidColorBrushTransition>(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);
|
||||
}
|
||||
|
||||
|
@ -98,6 +98,16 @@ internal class LineEditToken : AbstractControlDesignToken
|
||||
/// AddOn 大号内边距
|
||||
/// </summary>
|
||||
public Thickness AddOnPaddingLG { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 左边内部小组件的边距
|
||||
/// </summary>
|
||||
public Thickness LeftInnerAddOnMargin { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 右边内部小组件的边距
|
||||
/// </summary>
|
||||
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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user