diff --git a/demo/Ursa.Demo/Pages/AboutUsDemo.axaml b/demo/Ursa.Demo/Pages/AboutUsDemo.axaml
new file mode 100644
index 0000000..b63fe36
--- /dev/null
+++ b/demo/Ursa.Demo/Pages/AboutUsDemo.axaml
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+ #FFFDB7A5
+ #FFF6A0B5
+ #FFDD9BE0
+ #FFC4A7E9
+ #FFA7B3E1
+ #FF98CDFD
+ #FF95D8F8
+
+
+
+
+
+
+
+
+
+
+ #FFB42019
+ #FFA41751
+ #FF731F8A
+ #FF582EA0
+ #FF29368E
+ #FF135CB8
+ #FF0366A9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo/Pages/AboutUsDemo.axaml.cs b/demo/Ursa.Demo/Pages/AboutUsDemo.axaml.cs
new file mode 100644
index 0000000..4062b24
--- /dev/null
+++ b/demo/Ursa.Demo/Pages/AboutUsDemo.axaml.cs
@@ -0,0 +1,25 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Interactivity;
+using Avalonia.Markup.Xaml;
+using Ursa.Demo.ViewModels;
+
+namespace Ursa.Demo.Pages;
+
+public partial class AboutUsDemo : UserControl
+{
+ public AboutUsDemo()
+ {
+ InitializeComponent();
+ }
+
+ protected override void OnLoaded(RoutedEventArgs e)
+ {
+ base.OnLoaded(e);
+ if (DataContext is AboutUsDemoViewModel vm)
+ {
+ var launcher = TopLevel.GetTopLevel(this)?.Launcher;
+ vm.Launcher = launcher;
+ }
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo/ViewModels/AboutUsDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/AboutUsDemoViewModel.cs
new file mode 100644
index 0000000..c4e7fc6
--- /dev/null
+++ b/demo/Ursa.Demo/ViewModels/AboutUsDemoViewModel.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using System.Windows.Input;
+using Avalonia.Platform.Storage;
+using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Input;
+
+namespace Ursa.Demo.ViewModels;
+
+public partial class AboutUsDemoViewModel: ObservableObject
+{
+ public ICommand NavigateCommand { get; set; }
+
+ internal ILauncher? Launcher { get; set; }
+
+ public AboutUsDemoViewModel()
+ {
+ NavigateCommand = new AsyncRelayCommand(OnNavigateAsync);
+ }
+
+ private static readonly IReadOnlyDictionary _keyToUrlMapping = new Dictionary()
+ {
+ ["semi"] = "https://github.com/irihitech/Semi.Avalonia",
+ ["ursa"] = "https://github.com/irihitech/Ursa.Avalonia",
+ ["mantra"] = "https://www.bilibili.com/video/BV15pfKYbEEQ",
+ };
+
+ private async Task OnNavigateAsync(string? arg)
+ {
+ if (Launcher is not null && arg is not null && _keyToUrlMapping.TryGetValue(arg.ToLower(), out var uri))
+ {
+ await Launcher.LaunchUriAsync(new Uri(uri));
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs
index e591d80..361b236 100644
--- a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs
+++ b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs
@@ -35,6 +35,7 @@ public partial class MainViewViewModel : ViewModelBase
Content = s switch
{
MenuKeys.MenuKeyIntroduction => new IntroductionDemoViewModel(),
+ MenuKeys.MenuKeyAboutUs => new AboutUsDemoViewModel(),
MenuKeys.MenuKeyAutoCompleteBox => new AutoCompleteBoxDemoViewModel(),
MenuKeys.MenuKeyAvatar => new AvatarDemoViewModel(),
MenuKeys.MenuKeyBadge => new BadgeDemoViewModel(),
diff --git a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs
index 7dfffbd..14f4e60 100644
--- a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs
+++ b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs
@@ -9,6 +9,7 @@ public class MenuViewModel : ViewModelBase
MenuItems = new ObservableCollection
{
new() { MenuHeader = "Introduction", Key = MenuKeys.MenuKeyIntroduction, IsSeparator = false },
+ new() { MenuHeader = "About Us", Key = MenuKeys.MenuKeyAboutUs, IsSeparator = false },
new() { MenuHeader = "Controls", IsSeparator = true },
new()
{
@@ -102,6 +103,7 @@ public class MenuViewModel : ViewModelBase
public static class MenuKeys
{
public const string MenuKeyIntroduction = "Introduction";
+ public const string MenuKeyAboutUs = "AboutUs";
public const string MenuKeyAutoCompleteBox = "AutoCompleteBox";
public const string MenuKeyAvatar = "Avatar";
public const string MenuKeyBadge = "Badge";