diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/ButtonGroupDemo.axaml b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/ButtonGroupDemo.axaml
new file mode 100644
index 00000000..2e32175c
--- /dev/null
+++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/ButtonGroupDemo.axaml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/ButtonGroupDemo.axaml.cs b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/ButtonGroupDemo.axaml.cs
new file mode 100644
index 00000000..e522cb1d
--- /dev/null
+++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/ButtonGroupDemo.axaml.cs
@@ -0,0 +1,9 @@
+namespace HandyControlDemo.UserControl;
+
+public partial class ButtonGroupDemo : Avalonia.Controls.UserControl
+{
+ public ButtonGroupDemo()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/HoneycombPanelDemo.axaml b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/HoneycombPanelDemo.axaml
index 120eefd4..4f1dce0f 100644
--- a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/HoneycombPanelDemo.axaml
+++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/HoneycombPanelDemo.axaml
@@ -4,44 +4,47 @@
xmlns:vm="clr-namespace:HandyControlDemo.ViewModel"
xmlns:data="clr-namespace:HandyControlDemo.Data"
xmlns:cv="clr-namespace:HandyControlDemo.Tools.Converter"
+ xmlns:langs="clr-namespace:HandyControlDemo.Properties.Langs"
x:Class="HandyControlDemo.UserControl.HoneycombPanelDemo"
x:DataType="vm:CardDemoViewModel"
+ Background="{DynamicResource RegionBrush}"
DataContext="{Binding CardDemo, Source={x:Static vm:ViewModelLocator.Instance}}">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Avalonia/HandyControl_Avalonia/Controls/Button/ButtonGroup.cs b/src/Avalonia/HandyControl_Avalonia/Controls/Button/ButtonGroup.cs
new file mode 100644
index 00000000..b0919a6d
--- /dev/null
+++ b/src/Avalonia/HandyControl_Avalonia/Controls/Button/ButtonGroup.cs
@@ -0,0 +1,134 @@
+using System.Collections.Generic;
+using System.Linq;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+using Avalonia.Layout;
+using Avalonia.Styling;
+using HandyControl.Data;
+
+namespace HandyControl.Controls;
+
+public class ButtonGroup : ItemsControl
+{
+ public static readonly StyledProperty OrientationProperty =
+ StackPanel.OrientationProperty.AddOwner(
+ new StyledPropertyMetadata(defaultValue: Orientation.Horizontal));
+
+ public Orientation Orientation
+ {
+ get => GetValue(OrientationProperty);
+ set => SetValue(OrientationProperty, value);
+ }
+
+ public static readonly StyledProperty LayoutProperty =
+ AvaloniaProperty.Register(nameof(Layout), defaultValue: LinearLayout.Uniform);
+
+ public LinearLayout Layout
+ {
+ get => GetValue(LayoutProperty);
+ set => SetValue(LayoutProperty, value);
+ }
+
+ static ButtonGroup()
+ {
+ AffectsMeasure(OrientationProperty, LayoutProperty);
+ }
+
+ protected override bool NeedsContainerOverride(object? item, int index, out object? recycleKey)
+ {
+ if (item is Button or RadioButton or ToggleButton)
+ {
+ recycleKey = null;
+ return false;
+ }
+
+ return base.NeedsContainerOverride(item, index, out recycleKey);
+ }
+
+ protected override void PrepareContainerForItemOverride(Control container, object? item, int index)
+ {
+ base.PrepareContainerForItemOverride(container, item, index);
+
+ container.PropertyChanged += Container_PropertyChanged;
+ UpdateItemThemes();
+ }
+
+ protected override void ClearContainerForItemOverride(Control container)
+ {
+ base.ClearContainerForItemOverride(container);
+
+ container.PropertyChanged -= Container_PropertyChanged;
+ UpdateItemThemes();
+ }
+
+ private void Container_PropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
+ {
+ if (e.Property == IsVisibleProperty)
+ {
+ UpdateItemThemes();
+ }
+ }
+
+ private void UpdateItemThemes()
+ {
+ var visibleButtons = Items.OfType