From 81bf0e93c762c6715c3654cc80221585f589c263 Mon Sep 17 00:00:00 2001 From: chinboy Date: Fri, 17 Oct 2025 09:42:53 +0800 Subject: [PATCH] Optimize checkbox --- .../CheckBox/CheckBoxIndicator.cs | 65 +++++-------------- .../CheckBox/Themes/CheckBoxIndicator.axaml | 19 +++--- .../CheckBox/Themes/CheckBoxTheme.axaml | 19 +++--- .../CheckBox/Themes/CheckBoxThemeConstants.cs | 14 ---- 4 files changed, 35 insertions(+), 82 deletions(-) delete mode 100644 src/AtomUI.Controls/CheckBox/Themes/CheckBoxThemeConstants.cs diff --git a/src/AtomUI.Controls/CheckBox/CheckBoxIndicator.cs b/src/AtomUI.Controls/CheckBox/CheckBoxIndicator.cs index 21396d85d..534daeeb0 100644 --- a/src/AtomUI.Controls/CheckBox/CheckBoxIndicator.cs +++ b/src/AtomUI.Controls/CheckBox/CheckBoxIndicator.cs @@ -38,6 +38,9 @@ internal class CheckBoxIndicator : TemplatedControl public static readonly StyledProperty TristateMarkSizeProperty = AvaloniaProperty.Register(nameof(TristateMarkSize)); + + public static readonly StyledProperty CheckedMarkRenderTransformProperty = + AvaloniaProperty.Register(nameof (CheckedMarkRenderTransform)); public CheckBoxIndicatorState State { @@ -62,6 +65,12 @@ internal class CheckBoxIndicator : TemplatedControl get => GetValue(TristateMarkSizeProperty); set => SetValue(TristateMarkSizeProperty, value); } + + public ITransform? CheckedMarkRenderTransform + { + get => GetValue(CheckedMarkRenderTransformProperty); + set => SetValue(CheckedMarkRenderTransformProperty, value); + } #endregion @@ -86,8 +95,7 @@ internal class CheckBoxIndicator : TemplatedControl } #endregion - - private Icon? _checkedMark; + private IDisposable? _borderThicknessDisposable; private WaveSpiritDecorator? _waveSpiritDecorator; @@ -124,7 +132,9 @@ internal class CheckBoxIndicator : TemplatedControl Transitions = [ TransitionUtils.CreateTransition(BackgroundProperty), TransitionUtils.CreateTransition(BorderBrushProperty), - TransitionUtils.CreateTransition(TristateMarkBrushProperty) + TransitionUtils.CreateTransition(TristateMarkBrushProperty), + TransitionUtils.CreateTransition(CheckedMarkRenderTransformProperty, SharedTokenKey.MotionDurationMid, + new BackEaseOut()) ]; } } @@ -133,31 +143,7 @@ internal class CheckBoxIndicator : TemplatedControl Transitions = null; } } - - private void ConfigureCheckedMarkTransitions(bool force) - { - if (IsMotionEnabled) - { - if (_checkedMark != null) - { - if (force || _checkedMark.Transitions == null) - { - _checkedMark.Transitions = [ - TransitionUtils.CreateTransition(RenderTransformProperty, SharedTokenKey.MotionDurationMid, - new BackEaseOut()), - ]; - } - } - } - else - { - if (_checkedMark != null) - { - _checkedMark.Transitions = null; - } - } - } - + private void UpdatePseudoClasses() { PseudoClasses.Set(StdPseudoClass.Checked, State == CheckBoxIndicatorState.Checked); @@ -187,7 +173,6 @@ internal class CheckBoxIndicator : TemplatedControl if (e.Property == IsMotionEnabledProperty) { ConfigureTransitions(true); - ConfigureCheckedMarkTransitions(true); } } } @@ -207,26 +192,8 @@ internal class CheckBoxIndicator : TemplatedControl protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { base.OnApplyTemplate(e); - _checkedMark = e.NameScope.Find(CheckBoxIndicatorThemeConstants.CheckedMarkPart); - if (_checkedMark != null) - { - _checkedMark.Loaded += HandleCheckedMarkLoaded; - _checkedMark.Unloaded += HandleCheckedMarkUnLoaded; - } - _waveSpiritDecorator = e.NameScope.Find(CheckBoxIndicatorThemeConstants.WaveSpiritPart); - } - - private void HandleCheckedMarkLoaded(object? sender, RoutedEventArgs e) - { - ConfigureCheckedMarkTransitions(false); - } - - private void HandleCheckedMarkUnLoaded(object? sender, RoutedEventArgs e) - { - if (_checkedMark != null) - { - _checkedMark.Transitions = null; - } + _waveSpiritDecorator = e.NameScope.Find(WaveSpiritDecorator.WaveSpiritPart); } + } \ No newline at end of file diff --git a/src/AtomUI.Controls/CheckBox/Themes/CheckBoxIndicator.axaml b/src/AtomUI.Controls/CheckBox/Themes/CheckBoxIndicator.axaml index 2777033f5..b6a8cd045 100644 --- a/src/AtomUI.Controls/CheckBox/Themes/CheckBoxIndicator.axaml +++ b/src/AtomUI.Controls/CheckBox/Themes/CheckBoxIndicator.axaml @@ -7,7 +7,7 @@ - - - - diff --git a/src/AtomUI.Controls/CheckBox/Themes/CheckBoxTheme.axaml b/src/AtomUI.Controls/CheckBox/Themes/CheckBoxTheme.axaml index 915512298..8869f53dd 100644 --- a/src/AtomUI.Controls/CheckBox/Themes/CheckBoxTheme.axaml +++ b/src/AtomUI.Controls/CheckBox/Themes/CheckBoxTheme.axaml @@ -8,7 +8,7 @@ - - + @@ -36,15 +36,14 @@ Value="{DynamicResource {x:Static atom:SharedTokenKey.EnableWaveSpirit}}" /> - - - + - - \ No newline at end of file diff --git a/src/AtomUI.Controls/CheckBox/Themes/CheckBoxThemeConstants.cs b/src/AtomUI.Controls/CheckBox/Themes/CheckBoxThemeConstants.cs deleted file mode 100644 index 9f5436b89..000000000 --- a/src/AtomUI.Controls/CheckBox/Themes/CheckBoxThemeConstants.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace AtomUI.Controls.Themes; - -internal static class CheckBoxIndicatorThemeConstants -{ - public const string CheckedMarkPart = "PART_CheckedMark"; - public const string TristateMarkPart = "PART_TristateMark"; - public const string WaveSpiritPart = "PART_WaveSpirit"; -} - -internal static class CheckBoxThemeConstants -{ - public const string FramePart = "PART_Frame"; - public const string LabelTextPart = "PART_LabelText"; -} \ No newline at end of file