diff --git a/demo/Ursa.Demo/Pages/NavigationMenuDemo.axaml b/demo/Ursa.Demo/Pages/NavigationMenuDemo.axaml
new file mode 100644
index 0000000..62112d1
--- /dev/null
+++ b/demo/Ursa.Demo/Pages/NavigationMenuDemo.axaml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo/Pages/NavigationMenuDemo.axaml.cs b/demo/Ursa.Demo/Pages/NavigationMenuDemo.axaml.cs
new file mode 100644
index 0000000..0f369fc
--- /dev/null
+++ b/demo/Ursa.Demo/Pages/NavigationMenuDemo.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 NavigationMenuDemo : UserControl
+{
+ public NavigationMenuDemo()
+ {
+ InitializeComponent();
+ this.DataContext = new NavigationMenuDemoViewModel();
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo/ViewModels/NavigationMenuDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/NavigationMenuDemoViewModel.cs
new file mode 100644
index 0000000..f9c9bd6
--- /dev/null
+++ b/demo/Ursa.Demo/ViewModels/NavigationMenuDemoViewModel.cs
@@ -0,0 +1,41 @@
+using System.Collections.ObjectModel;
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace Ursa.Demo.ViewModels;
+
+public class NavigationMenuDemoViewModel: ObservableObject
+{
+ public ObservableCollection MenuItems { get; set; } = new()
+ {
+ new NavigationMenuItemViewModel()
+ {
+ MenuHeader = "1",
+ Children = new ObservableCollection()
+ {
+ new NavigationMenuItemViewModel(){
+ MenuHeader = "11" ,
+ Children = new ObservableCollection()
+ {
+ new NavigationMenuItemViewModel(){MenuHeader = "111"},
+ new NavigationMenuItemViewModel(){MenuHeader = "112"}
+ }},
+ new NavigationMenuItemViewModel(){MenuHeader = "12"}
+ }
+ },
+ new NavigationMenuItemViewModel()
+ {
+ MenuHeader = "2",
+ Children = new ObservableCollection()
+ {
+ new NavigationMenuItemViewModel(){MenuHeader = "21"},
+ new NavigationMenuItemViewModel(){MenuHeader = "22"}
+ }
+ }
+ };
+}
+
+public class NavigationMenuItemViewModel: ObservableObject
+{
+ public string MenuHeader { get; set; }
+ public ObservableCollection Children { get; set; } = new();
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo/Views/MainWindow.axaml b/demo/Ursa.Demo/Views/MainWindow.axaml
index 76a2f17..230667b 100644
--- a/demo/Ursa.Demo/Views/MainWindow.axaml
+++ b/demo/Ursa.Demo/Views/MainWindow.axaml
@@ -35,6 +35,9 @@
+
+
+
diff --git a/src/Ursa.Themes.Semi/Controls/Navigation.axaml b/src/Ursa.Themes.Semi/Controls/Navigation.axaml
new file mode 100644
index 0000000..086729e
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Controls/Navigation.axaml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ursa.Themes.Semi/Controls/_index.axaml b/src/Ursa.Themes.Semi/Controls/_index.axaml
index 48da0db..8cf36e5 100644
--- a/src/Ursa.Themes.Semi/Controls/_index.axaml
+++ b/src/Ursa.Themes.Semi/Controls/_index.axaml
@@ -5,6 +5,7 @@
+
diff --git a/src/Ursa/Controls/Navigation/NavigationMenu.cs b/src/Ursa/Controls/Navigation/NavigationMenu.cs
new file mode 100644
index 0000000..deadac4
--- /dev/null
+++ b/src/Ursa/Controls/Navigation/NavigationMenu.cs
@@ -0,0 +1,68 @@
+using System.Collections;
+using System.Collections.Specialized;
+using Avalonia;
+using Avalonia.Collections;
+using Avalonia.Controls;
+using Avalonia.Controls.Presenters;
+using Avalonia.Controls.Primitives;
+using Avalonia.Controls.Templates;
+using Avalonia.Input;
+using Avalonia.Markup.Xaml.Templates;
+using Avalonia.Metadata;
+
+namespace Ursa.Controls;
+
+public class NavigationMenu: HeaderedSelectingItemsControl
+{
+ public static readonly StyledProperty