From a82eee5346cbfc68f1bee9ad65fc3003b284096e Mon Sep 17 00:00:00 2001 From: qinware Date: Thu, 28 Aug 2025 16:19:48 +0800 Subject: [PATCH] Add ColorSliderThumb --- .../ColorPicker/AbstractColorPicker.cs | 38 ++++++++++++------- .../ColorPicker/ColorPickerToken.cs | 30 +++++++++++++++ .../ColorSlider/ColorSliderThumb.cs | 38 ++++++++++++++++++- .../ColorPicker/ColorView/ColorPickerView.cs | 2 - .../ColorSlider/ColorSliderThumbTheme.axaml | 38 +++++++++++++------ .../TokenResourceConst.g.cs | 2 + 6 files changed, 119 insertions(+), 29 deletions(-) diff --git a/src/AtomUI.Controls/ColorPicker/AbstractColorPicker.cs b/src/AtomUI.Controls/ColorPicker/AbstractColorPicker.cs index 22c3e9af9..95144763e 100644 --- a/src/AtomUI.Controls/ColorPicker/AbstractColorPicker.cs +++ b/src/AtomUI.Controls/ColorPicker/AbstractColorPicker.cs @@ -11,6 +11,7 @@ using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives.PopupPositioning; using Avalonia.Data; +using Avalonia.Interactivity; using Avalonia.LogicalTree; using Avalonia.Media; @@ -178,12 +179,15 @@ public abstract class AbstractColorPicker : AvaloniaButton, protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { base.OnPropertyChanged(change); - if (change.Property == IsMotionEnabledProperty) + if (IsLoaded) { - ConfigureTransitions(); + if (change.Property == IsMotionEnabledProperty) + { + ConfigureTransitions(true); + } } - else if (change.Property == IsShowTextProperty || - change.Property == FormatProperty) + + if (change.Property == IsShowTextProperty || change.Property == FormatProperty) { GenerateValueText(); } @@ -192,25 +196,33 @@ public abstract class AbstractColorPicker : AvaloniaButton, protected abstract void GenerateValueText(); protected abstract void GenerateColorBlockBackground(); - private void ConfigureTransitions() + private void ConfigureTransitions(bool force) { if (IsMotionEnabled) { - Transitions = new Transitions() + if (force || Transitions == null) { - TransitionUtils.CreateTransition(BorderBrushProperty) - }; + Transitions = + [ + TransitionUtils.CreateTransition(BorderBrushProperty) + ]; + } } else { - Transitions?.Clear(); Transitions = null; } } - - protected override void OnApplyTemplate(TemplateAppliedEventArgs e) + + protected override void OnLoaded(RoutedEventArgs e) { - base.OnApplyTemplate(e); - ConfigureTransitions(); + base.OnLoaded(e); + ConfigureTransitions(false); + } + + protected override void OnUnloaded(RoutedEventArgs e) + { + base.OnUnloaded(e); + Transitions = null; } } \ No newline at end of file diff --git a/src/AtomUI.Controls/ColorPicker/ColorPickerToken.cs b/src/AtomUI.Controls/ColorPicker/ColorPickerToken.cs index cac7f7eda..f8821946b 100644 --- a/src/AtomUI.Controls/ColorPicker/ColorPickerToken.cs +++ b/src/AtomUI.Controls/ColorPicker/ColorPickerToken.cs @@ -66,6 +66,16 @@ public class ColorPickerToken : AbstractControlDesignToken /// public double ColorPickerSliderTrackSize { get; set; } + /// + /// ColorPicker 轨道 handle 的大小 + /// + public double ColorPickerSliderThumbSize { get; set; } + + /// + /// ColorPicker 轨道 handle 的阴影 + /// + public BoxShadows ColorPickerSliderThumbShadow { get; set; } + /// /// ColorPicker 预览尺寸 /// Preview size of ColorPicker @@ -127,6 +137,7 @@ public class ColorPickerToken : AbstractControlDesignToken ColorPickerPresetColorSize = 24; ColorPickerSliderSize = ColorPickerHandlerSizeSM; ColorPickerSliderTrackSize = 8; + ColorPickerSliderThumbSize = ColorPickerHandlerSizeSM + SharedToken.LineWidth * 2; ColorPickerPreviewSize = ColorPickerSliderSize * 2 + SharedToken.UniformlyMarginSM; ColorPickerInsetShadow = new BoxShadows(new BoxShadow() { @@ -137,6 +148,25 @@ public class ColorPickerToken : AbstractControlDesignToken Spread = 0, Color = SharedToken.ColorTextQuaternary }); + + ColorPickerSliderThumbShadow = new BoxShadows(new BoxShadow() + { + IsInset = true, + OffsetX = 0, + OffsetY = 0, + Blur = 1, + Spread = 0, + Color = SharedToken.ColorTextQuaternary + }, [ + new BoxShadow + { + OffsetX = 0, + OffsetY = 0, + Blur = 0, + Spread = 1, + Color = SharedToken.ColorFillSecondary + } + ]); ColorBlockInnerShadows = new BoxShadows(new BoxShadow() { IsInset = true, diff --git a/src/AtomUI.Controls/ColorPicker/ColorSlider/ColorSliderThumb.cs b/src/AtomUI.Controls/ColorPicker/ColorSlider/ColorSliderThumb.cs index b16e6c3e5..e3bbb9495 100644 --- a/src/AtomUI.Controls/ColorPicker/ColorSlider/ColorSliderThumb.cs +++ b/src/AtomUI.Controls/ColorPicker/ColorSlider/ColorSliderThumb.cs @@ -1,9 +1,43 @@ +using System.Diagnostics; +using System.Reactive.Disposables; using AtomUI.Controls.Primitives; using AtomUI.Theme; +using AtomUI.Theme.Data; +using AtomUI.Theme.Styling; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Data; +using Avalonia.LogicalTree; +using Avalonia.Utilities; namespace AtomUI.Controls; -internal class ColorSliderThumb : Thumb +internal class ColorSliderThumb : Thumb, IResourceBindingManager { - + #region 内部属性定义 + CompositeDisposable? IResourceBindingManager.ResourceBindingsDisposable { get; set; } + + #endregion + + protected override void OnSizeChanged(SizeChangedEventArgs e) + { + base.OnSizeChanged(e); + Debug.Assert(MathUtilities.AreClose(e.NewSize.Width, e.NewSize.Height)); + CornerRadius = new CornerRadius(e.NewSize.Width / 2); + } + + protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e) + { + base.OnAttachedToLogicalTree(e); + this.AddResourceBindingDisposable(TokenResourceBinder.CreateTokenBinding(this, BorderThicknessProperty, + SharedTokenKey.BorderThickness, + BindingPriority.Template, + new RenderScaleAwareThicknessConfigure(this))); + } + + protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e) + { + base.OnDetachedFromLogicalTree(e); + this.DisposeTokenBindings(); + } } \ No newline at end of file diff --git a/src/AtomUI.Controls/ColorPicker/ColorView/ColorPickerView.cs b/src/AtomUI.Controls/ColorPicker/ColorView/ColorPickerView.cs index e5b03fca5..3453719f0 100644 --- a/src/AtomUI.Controls/ColorPicker/ColorView/ColorPickerView.cs +++ b/src/AtomUI.Controls/ColorPicker/ColorView/ColorPickerView.cs @@ -6,6 +6,4 @@ public class ColorPickerView : AbstractColorPickerView { #region 公共属性定义 #endregion - - } \ No newline at end of file diff --git a/src/AtomUI.Controls/ColorPicker/Themes/ColorSlider/ColorSliderThumbTheme.axaml b/src/AtomUI.Controls/ColorPicker/Themes/ColorSlider/ColorSliderThumbTheme.axaml index fdbc8ffaa..6903edc66 100644 --- a/src/AtomUI.Controls/ColorPicker/Themes/ColorSlider/ColorSliderThumbTheme.axaml +++ b/src/AtomUI.Controls/ColorPicker/Themes/ColorSlider/ColorSliderThumbTheme.axaml @@ -5,26 +5,40 @@ x:ClassModifier="internal"> - - - - - - - - - + + + + + + + + + + + + + + - + \ No newline at end of file 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 2f5ddc4ef..9ecf1e6bf 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 @@ -248,6 +248,8 @@ namespace AtomUI.Theme.Styling public static readonly TokenResourceKey ColorPickerPresetColorSize = new TokenResourceKey("ColorPicker.ColorPickerPresetColorSize"); public static readonly TokenResourceKey ColorPickerPreviewSize = new TokenResourceKey("ColorPicker.ColorPickerPreviewSize"); public static readonly TokenResourceKey ColorPickerSliderSize = new TokenResourceKey("ColorPicker.ColorPickerSliderSize"); + public static readonly TokenResourceKey ColorPickerSliderThumbShadow = new TokenResourceKey("ColorPicker.ColorPickerSliderThumbShadow"); + public static readonly TokenResourceKey ColorPickerSliderThumbSize = new TokenResourceKey("ColorPicker.ColorPickerSliderThumbSize"); public static readonly TokenResourceKey ColorPickerSliderTrackSize = new TokenResourceKey("ColorPicker.ColorPickerSliderTrackSize"); public static readonly TokenResourceKey ColorPickerWidth = new TokenResourceKey("ColorPicker.ColorPickerWidth"); public static readonly TokenResourceKey ColorSpectrumHeight = new TokenResourceKey("ColorPicker.ColorSpectrumHeight");