diff --git a/demo/Ursa.Demo/Pages/ButtonGroupDemo.axaml b/demo/Ursa.Demo/Pages/ButtonGroupDemo.axaml
new file mode 100644
index 0000000..510c423
--- /dev/null
+++ b/demo/Ursa.Demo/Pages/ButtonGroupDemo.axaml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo/Pages/ButtonGroupDemo.axaml.cs b/demo/Ursa.Demo/Pages/ButtonGroupDemo.axaml.cs
new file mode 100644
index 0000000..695bcd1
--- /dev/null
+++ b/demo/Ursa.Demo/Pages/ButtonGroupDemo.axaml.cs
@@ -0,0 +1,15 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+using Ursa.Demo.ViewModels;
+
+namespace Ursa.Demo.Pages;
+
+public partial class ButtonGroupDemo : UserControl
+{
+ public ButtonGroupDemo()
+ {
+ InitializeComponent();
+ this.DataContext = new ButtonGroupViewModel();
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo/ViewModels/ButtonGroupViewModel.cs b/demo/Ursa.Demo/ViewModels/ButtonGroupViewModel.cs
new file mode 100644
index 0000000..aeb2400
--- /dev/null
+++ b/demo/Ursa.Demo/ViewModels/ButtonGroupViewModel.cs
@@ -0,0 +1,11 @@
+using System.Collections.ObjectModel;
+
+namespace Ursa.Demo.ViewModels;
+
+public class ButtonGroupViewModel: ViewModelBase
+{
+ public ObservableCollection Items { get; set; } = new ObservableCollection()
+ {
+ "Ding", "Otter", "Husky", "Mr. 17", "Cass"
+ };
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo/Views/MainWindow.axaml b/demo/Ursa.Demo/Views/MainWindow.axaml
index ee33626..d6da845 100644
--- a/demo/Ursa.Demo/Views/MainWindow.axaml
+++ b/demo/Ursa.Demo/Views/MainWindow.axaml
@@ -29,6 +29,9 @@
+
+
+
diff --git a/src/Ursa.Themes.Semi/Controls/ButtonGroup.axaml b/src/Ursa.Themes.Semi/Controls/ButtonGroup.axaml
new file mode 100644
index 0000000..15a70c1
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Controls/ButtonGroup.axaml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ursa.Themes.Semi/Controls/_index.axaml b/src/Ursa.Themes.Semi/Controls/_index.axaml
index c0c304a..7c621a3 100644
--- a/src/Ursa.Themes.Semi/Controls/_index.axaml
+++ b/src/Ursa.Themes.Semi/Controls/_index.axaml
@@ -3,6 +3,7 @@
+
diff --git a/src/Ursa.Themes.Semi/Index.axaml b/src/Ursa.Themes.Semi/Index.axaml
index 414abaa..6e94216 100644
--- a/src/Ursa.Themes.Semi/Index.axaml
+++ b/src/Ursa.Themes.Semi/Index.axaml
@@ -17,5 +17,7 @@
+
+
diff --git a/src/Ursa.Themes.Semi/Styles/ButtonGroup.axaml b/src/Ursa.Themes.Semi/Styles/ButtonGroup.axaml
new file mode 100644
index 0000000..9317410
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Styles/ButtonGroup.axaml
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ursa.Themes.Semi/Styles/_index.axaml b/src/Ursa.Themes.Semi/Styles/_index.axaml
new file mode 100644
index 0000000..8423f00
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Styles/_index.axaml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/Ursa.Themes.Semi/Themes/Dark/ButtonGroup.axaml b/src/Ursa.Themes.Semi/Themes/Dark/ButtonGroup.axaml
new file mode 100644
index 0000000..6ae7f40
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Themes/Dark/ButtonGroup.axaml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml b/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml
index 025d14f..c892d42 100644
--- a/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml
+++ b/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml
@@ -3,6 +3,7 @@
+
diff --git a/src/Ursa.Themes.Semi/Themes/Light/ButtonGroup.axaml b/src/Ursa.Themes.Semi/Themes/Light/ButtonGroup.axaml
new file mode 100644
index 0000000..6645722
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Themes/Light/ButtonGroup.axaml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ursa.Themes.Semi/Themes/Light/_index.axaml b/src/Ursa.Themes.Semi/Themes/Light/_index.axaml
index 025d14f..c892d42 100644
--- a/src/Ursa.Themes.Semi/Themes/Light/_index.axaml
+++ b/src/Ursa.Themes.Semi/Themes/Light/_index.axaml
@@ -3,6 +3,7 @@
+
diff --git a/src/Ursa.Themes.Semi/Themes/Shared/ButtonGroup.axaml b/src/Ursa.Themes.Semi/Themes/Shared/ButtonGroup.axaml
new file mode 100644
index 0000000..b7459fd
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Themes/Shared/ButtonGroup.axaml
@@ -0,0 +1,10 @@
+
+
+ 14
+ 600
+ 3
+
+ 12 6
+ 16 10
+ 6 2
+
diff --git a/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml b/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml
index d8dca1e..5e6a238 100644
--- a/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml
+++ b/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml
@@ -3,6 +3,7 @@
+
diff --git a/src/Ursa/Controls/ButtonGroup.cs b/src/Ursa/Controls/ButtonGroup.cs
new file mode 100644
index 0000000..773a1b4
--- /dev/null
+++ b/src/Ursa/Controls/ButtonGroup.cs
@@ -0,0 +1,23 @@
+using System.Net.Http.Headers;
+using Avalonia;
+using Avalonia.Collections;
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+using Avalonia.Media;
+using Avalonia.Metadata;
+
+namespace Ursa.Controls;
+
+public class ButtonGroup: ItemsControl
+{
+ protected override bool NeedsContainerOverride(object? item, int index, out object? recycleKey)
+ {
+ recycleKey = null;
+ return item is not Button;
+ }
+
+ protected override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey)
+ {
+ return new Button();
+ }
+}
\ No newline at end of file