From 8a7fc0dedda5b170b9aff9b0abc4384ce11ef894 Mon Sep 17 00:00:00 2001 From: CHINBOY Date: Tue, 10 Jun 2025 13:29:27 +0800 Subject: [PATCH] Refactor RadioButton use axaml theme --- .../AtomUIOSSControlThemesProvider.axaml | 1 + .../ControlThemePool.g.cs | 1 - .../RadioButton/RadioButtonTheme.cs | 162 ------------------ .../RadioButton/RadioButtonThemeConstants.cs | 8 + .../RadioButton/Themes/RadioButtonTheme.axaml | 81 +++++++++ 5 files changed, 90 insertions(+), 163 deletions(-) delete mode 100644 src/AtomUI.Controls/RadioButton/RadioButtonTheme.cs create mode 100644 src/AtomUI.Controls/RadioButton/RadioButtonThemeConstants.cs diff --git a/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml b/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml index 66a93f04f..355359705 100644 --- a/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml +++ b/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml @@ -6,6 +6,7 @@ + diff --git a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.ControlThemePoolGenerator/ControlThemePool.g.cs b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.ControlThemePoolGenerator/ControlThemePool.g.cs index e9ffed228..5848efa61 100644 --- a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.ControlThemePoolGenerator/ControlThemePool.g.cs +++ b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.ControlThemePoolGenerator/ControlThemePool.g.cs @@ -81,7 +81,6 @@ namespace AtomUI.Theme themes.Add(new AtomUI.Controls.PrimaryButtonTheme()); themes.Add(new AtomUI.Controls.PrimaryDropdownButtonTheme()); themes.Add(new AtomUI.Controls.ProgressBarTheme()); - themes.Add(new AtomUI.Controls.RadioButtonTheme()); themes.Add(new AtomUI.Controls.RangeDatePickerFlyoutPresenterTheme()); themes.Add(new AtomUI.Controls.RangeDatePickerTheme()); themes.Add(new AtomUI.Controls.RangeTimePickerTheme()); diff --git a/src/AtomUI.Controls/RadioButton/RadioButtonTheme.cs b/src/AtomUI.Controls/RadioButton/RadioButtonTheme.cs deleted file mode 100644 index 47ac7926d..000000000 --- a/src/AtomUI.Controls/RadioButton/RadioButtonTheme.cs +++ /dev/null @@ -1,162 +0,0 @@ -using AtomUI.Theme; -using AtomUI.Theme.Styling; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.Presenters; -using Avalonia.Controls.Primitives; -using Avalonia.Controls.Templates; -using Avalonia.Data; -using Avalonia.Data.Converters; -using Avalonia.Input; -using Avalonia.Layout; -using Avalonia.Styling; - -namespace AtomUI.Controls; - -[ControlThemeProvider] -internal class RadioButtonTheme : BaseControlTheme -{ - internal const string FramePart = "PART_Frame"; - internal const string IndicatorPart = "PART_Indicator"; - internal const string LabelTextPart = "PART_LabelText"; - - public RadioButtonTheme() - : base(typeof(RadioButton)) - { - } - - protected override IControlTemplate BuildControlTemplate() - { - return new FuncControlTemplate((radioButton, scope) => - { - var frame = new Border - { - Name = FramePart, - Padding = new Thickness(0, 1, 0, 1) - }; - - CreateTemplateParentBinding(frame, Border.BackgroundProperty, RadioButton.BackgroundProperty); - CreateTemplateParentBinding(frame, Border.BorderBrushProperty, RadioButton.BorderBrushProperty); - CreateTemplateParentBinding(frame, Border.BorderThicknessProperty, RadioButton.BorderThicknessProperty); - CreateTemplateParentBinding(frame, Border.CornerRadiusProperty, RadioButton.CornerRadiusProperty); - - var layout = new DockPanel - { - LastChildFill = true - }; - - var indicator = new RadioIndicator - { - Name = IndicatorPart, - VerticalAlignment = VerticalAlignment.Center - }; - DockPanel.SetDock(indicator, Dock.Left); - CreateTemplateParentBinding(indicator, RadioIndicator.IsMotionEnabledProperty, - RadioButton.IsMotionEnabledProperty); - CreateTemplateParentBinding(indicator, RadioIndicator.IsWaveAnimationEnabledProperty, - RadioButton.IsWaveSpiritEnabledProperty); - CreateTemplateParentBinding(indicator, RadioIndicator.IsEnabledProperty, RadioButton.IsEnabledProperty); - CreateTemplateParentBinding(indicator, RadioIndicator.IsCheckedProperty, RadioButton.IsCheckedProperty); - layout.Children.Add(indicator); - - var labelText = new TextBlock() - { - Name = LabelTextPart, - VerticalAlignment = VerticalAlignment.Center, - }; - - CreateTemplateParentBinding(labelText, TextBlock.TextProperty, RadioButton.ContentProperty, - BindingMode.Default, - new FuncValueConverter(content => content?.ToString())); - CreateTemplateParentBinding(labelText, TextBlock.FontSizeProperty, RadioButton.FontSizeProperty); - CreateTemplateParentBinding(labelText, TextBlock.IsVisibleProperty, RadioButton.ContentProperty, - BindingMode.Default, - ObjectConverters.IsNotNull); - - layout.Children.Add(labelText); - frame.Child = layout; - return frame; - }); - } - - protected override void BuildStyles() - { - var commonStyle = new Style(selector => selector.Nesting()); - commonStyle.Add(RadioButton.CursorProperty, - new SetterValueFactory(() => new Cursor(StandardCursorType.Hand))); - commonStyle.Add(RadioButton.HorizontalAlignmentProperty, HorizontalAlignment.Left); - - var disableStyle = - new Style(selector => selector.Nesting().PropertyEquals(InputElement.IsEnabledProperty, false)); - disableStyle.Add(TemplatedControl.ForegroundProperty, SharedTokenKey.ColorTextDisabled); - commonStyle.Add(disableStyle); - - var labelTextStyle = new Style(selector => selector.Nesting().Template().Name(LabelTextPart)); - labelTextStyle.Add(ContentPresenter.MarginProperty, RadioButtonTokenKey.TextMargin); - commonStyle.Add(labelTextStyle); - - Add(commonStyle); - - BuildIndicatorStyle(); - } - - private void BuildIndicatorStyle() - { - { - var indicatorStyle = new Style(selector => selector.Nesting().Template().Name(IndicatorPart)); - indicatorStyle.Add(RadioIndicator.RadioSizeProperty, RadioButtonTokenKey.RadioSize); - indicatorStyle.Add(RadioIndicator.WidthProperty, RadioButtonTokenKey.RadioSize); - indicatorStyle.Add(RadioIndicator.HeightProperty, RadioButtonTokenKey.RadioSize); - indicatorStyle.Add(RadioIndicator.DotSizeValueProperty, RadioButtonTokenKey.DotSize); - indicatorStyle.Add(RadioIndicator.DotPaddingProperty, RadioButtonTokenKey.DotPadding); - Add(indicatorStyle); - } - var disableStyle = - new Style(selector => selector.Nesting().PropertyEquals(InputElement.IsEnabledProperty, false)); - { - var indicatorStyle = new Style(selector => selector.Nesting().Template().Name(IndicatorPart)); - indicatorStyle.Add(RadioIndicator.RadioBackgroundProperty, SharedTokenKey.ColorBgContainerDisabled); - indicatorStyle.Add(RadioIndicator.RadioBorderBrushProperty, SharedTokenKey.ColorBorder); - indicatorStyle.Add(RadioIndicator.RadioInnerBackgroundProperty, RadioButtonTokenKey.DotColorDisabled); - disableStyle.Add(indicatorStyle); - } - Add(disableStyle); - - var enabledStyle = - new Style(selector => selector.Nesting().PropertyEquals(InputElement.IsEnabledProperty, true)); - { - { - var indicatorStyle = new Style(selector => selector.Nesting().Template().Name(IndicatorPart)); - indicatorStyle.Add(RadioIndicator.RadioInnerBackgroundProperty, RadioButtonTokenKey.RadioColor); - indicatorStyle.Add(RadioIndicator.RadioBorderBrushProperty, SharedTokenKey.ColorBorder); - enabledStyle.Add(indicatorStyle); - } - - var checkedStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.Checked)); - { - var indicatorStyle = new Style(selector => selector.Nesting().Template().Name(IndicatorPart)); - indicatorStyle.Add(RadioIndicator.RadioBorderBrushProperty, SharedTokenKey.ColorPrimary); - indicatorStyle.Add(RadioIndicator.RadioBackgroundProperty, SharedTokenKey.ColorPrimary); - checkedStyle.Add(indicatorStyle); - } - enabledStyle.Add(checkedStyle); - - var unCheckedStyle = - new Style(selector => selector.Nesting().Not(x => x.Nesting().Class(StdPseudoClass.Checked))); - { - var indicatorStyle = new Style(selector => selector.Nesting().Template().Name(IndicatorPart)); - indicatorStyle.Add(RadioIndicator.RadioBackgroundProperty, SharedTokenKey.ColorBgContainer); - unCheckedStyle.Add(indicatorStyle); - } - var unCheckedHoverStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.PointerOver)); - { - var indicatorStyle = new Style(selector => selector.Nesting().Template().Name(IndicatorPart)); - indicatorStyle.Add(RadioIndicator.RadioBorderBrushProperty, SharedTokenKey.ColorPrimary); - unCheckedHoverStyle.Add(indicatorStyle); - } - unCheckedStyle.Add(unCheckedHoverStyle); - enabledStyle.Add(unCheckedStyle); - } - Add(enabledStyle); - } -} \ No newline at end of file diff --git a/src/AtomUI.Controls/RadioButton/RadioButtonThemeConstants.cs b/src/AtomUI.Controls/RadioButton/RadioButtonThemeConstants.cs new file mode 100644 index 000000000..3de56efc9 --- /dev/null +++ b/src/AtomUI.Controls/RadioButton/RadioButtonThemeConstants.cs @@ -0,0 +1,8 @@ +namespace AtomUI.Controls; + +internal class RadioButtonThemeConstants +{ + public const string FramePart = "PART_Frame"; + public const string IndicatorPart = "PART_Indicator"; + public const string LabelTextPart = "PART_LabelText"; +} \ No newline at end of file diff --git a/src/AtomUI.Controls/RadioButton/Themes/RadioButtonTheme.axaml b/src/AtomUI.Controls/RadioButton/Themes/RadioButtonTheme.axaml index 0aa51a88d..a3a00c116 100644 --- a/src/AtomUI.Controls/RadioButton/Themes/RadioButtonTheme.axaml +++ b/src/AtomUI.Controls/RadioButton/Themes/RadioButtonTheme.axaml @@ -4,6 +4,87 @@ xmlns:atom="https://atomui.net"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file