From 82312e747757b92fc28921a639648cd8b101ef42 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Wed, 26 Jul 2023 10:20:13 +0800 Subject: [PATCH] feat: initial DualBadge. --- demo/Ursa.Demo/Models/MenuKeys.cs | 1 + demo/Ursa.Demo/Pages/DualBadgeDemo.axaml | 23 ++++++++ demo/Ursa.Demo/Pages/DualBadgeDemo.axaml.cs | 11 ++++ .../ViewModels/DualBadgeDemoViewModel.cs | 5 ++ .../Ursa.Demo/ViewModels/MainViewViewModel.cs | 1 + demo/Ursa.Demo/ViewModels/MenuViewModel.cs | 1 + src/Ursa.Themes.Semi/Controls/DualBadge.axaml | 45 ++++++++++++++++ src/Ursa.Themes.Semi/Controls/_index.axaml | 1 + .../Themes/Dark/DualBadge.axaml | 3 ++ src/Ursa.Themes.Semi/Themes/Dark/_index.axaml | 1 + .../Themes/Light/DualBadge.axaml | 3 ++ .../Themes/Light/_index.axaml | 1 + .../Themes/Shared/DualBadge.axaml | 2 + .../Themes/Shared/_index.axaml | 1 + src/Ursa/Controls/DualBadge.cs | 53 +++++++++++++++++++ 15 files changed, 152 insertions(+) create mode 100644 demo/Ursa.Demo/Pages/DualBadgeDemo.axaml create mode 100644 demo/Ursa.Demo/Pages/DualBadgeDemo.axaml.cs create mode 100644 demo/Ursa.Demo/ViewModels/DualBadgeDemoViewModel.cs create mode 100644 src/Ursa.Themes.Semi/Controls/DualBadge.axaml create mode 100644 src/Ursa.Themes.Semi/Themes/Dark/DualBadge.axaml create mode 100644 src/Ursa.Themes.Semi/Themes/Light/DualBadge.axaml create mode 100644 src/Ursa.Themes.Semi/Themes/Shared/DualBadge.axaml create mode 100644 src/Ursa/Controls/DualBadge.cs diff --git a/demo/Ursa.Demo/Models/MenuKeys.cs b/demo/Ursa.Demo/Models/MenuKeys.cs index 5a76eb9..1d8954e 100644 --- a/demo/Ursa.Demo/Models/MenuKeys.cs +++ b/demo/Ursa.Demo/Models/MenuKeys.cs @@ -6,6 +6,7 @@ public static class MenuKeys public const string MenuKeyBanner = "Banner"; public const string MenuKeyButtonGroup = "ButtonGroup"; public const string MenuKeyDivider = "Divider"; + public const string MenuKeyDualBadge = "DualBadge"; public const string MenuKeyIpBox = "IPv4Box"; public const string MenuKeyLoading = "Loading"; public const string MenuKeyNavigation = "Navigation"; diff --git a/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml b/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml new file mode 100644 index 0000000..d0aea05 --- /dev/null +++ b/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml @@ -0,0 +1,23 @@ + + + + + + + passing + + + \ No newline at end of file diff --git a/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml.cs b/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml.cs new file mode 100644 index 0000000..6db9c2f --- /dev/null +++ b/demo/Ursa.Demo/Pages/DualBadgeDemo.axaml.cs @@ -0,0 +1,11 @@ +using Avalonia.Controls; + +namespace Ursa.Demo.Pages; + +public partial class DualBadgeDemo : UserControl +{ + public DualBadgeDemo() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/demo/Ursa.Demo/ViewModels/DualBadgeDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/DualBadgeDemoViewModel.cs new file mode 100644 index 0000000..bc992fc --- /dev/null +++ b/demo/Ursa.Demo/ViewModels/DualBadgeDemoViewModel.cs @@ -0,0 +1,5 @@ +namespace Ursa.Demo.ViewModels; + +public class DualBadgeDemoViewModel : ViewModelBase +{ +} \ No newline at end of file diff --git a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs index 6641f1f..54109ae 100644 --- a/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/MainViewViewModel.cs @@ -28,6 +28,7 @@ public class MainViewViewModel : ViewModelBase MenuKeys.MenuKeyBanner => new BannerDemoViewModel(), MenuKeys.MenuKeyButtonGroup => new ButtonGroupDemoViewModel(), MenuKeys.MenuKeyDivider => new DividerDemoViewModel(), + MenuKeys.MenuKeyDualBadge => new DualBadgeDemoViewModel(), MenuKeys.MenuKeyIpBox => new IPv4BoxDemoViewModel(), MenuKeys.MenuKeyLoading => new LoadingDemoViewModel(), MenuKeys.MenuKeyNavigation => new NavigationMenuDemoViewModel(), diff --git a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs index 9351ad9..011375b 100644 --- a/demo/Ursa.Demo/ViewModels/MenuViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/MenuViewModel.cs @@ -15,6 +15,7 @@ public class MenuViewModel: ViewModelBase new() { MenuHeader = "Banner", Key = MenuKeys.MenuKeyBanner }, new() { MenuHeader = "ButtonGroup", Key = MenuKeys.MenuKeyButtonGroup }, new() { MenuHeader = "Divider", Key = MenuKeys.MenuKeyDivider }, + new() { MenuHeader = "DualBadge", Key = MenuKeys.MenuKeyDualBadge }, new() { MenuHeader = "IPv4Box", Key = MenuKeys.MenuKeyIpBox }, new() { MenuHeader = "Loading", Key = MenuKeys.MenuKeyLoading }, new() { MenuHeader = "Navigation", Key = MenuKeys.MenuKeyNavigation }, diff --git a/src/Ursa.Themes.Semi/Controls/DualBadge.axaml b/src/Ursa.Themes.Semi/Controls/DualBadge.axaml new file mode 100644 index 0000000..05ec0de --- /dev/null +++ b/src/Ursa.Themes.Semi/Controls/DualBadge.axaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Ursa.Themes.Semi/Controls/_index.axaml b/src/Ursa.Themes.Semi/Controls/_index.axaml index bbf2752..dee9b3c 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.Themes.Semi/Themes/Dark/DualBadge.axaml b/src/Ursa.Themes.Semi/Themes/Dark/DualBadge.axaml new file mode 100644 index 0000000..d57aae4 --- /dev/null +++ b/src/Ursa.Themes.Semi/Themes/Dark/DualBadge.axaml @@ -0,0 +1,3 @@ + + LightGray + diff --git a/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml b/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml index c9f2bea..aa85239 100644 --- a/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml +++ b/src/Ursa.Themes.Semi/Themes/Dark/_index.axaml @@ -5,6 +5,7 @@ + diff --git a/src/Ursa.Themes.Semi/Themes/Light/DualBadge.axaml b/src/Ursa.Themes.Semi/Themes/Light/DualBadge.axaml new file mode 100644 index 0000000..d57aae4 --- /dev/null +++ b/src/Ursa.Themes.Semi/Themes/Light/DualBadge.axaml @@ -0,0 +1,3 @@ + + LightGray + diff --git a/src/Ursa.Themes.Semi/Themes/Light/_index.axaml b/src/Ursa.Themes.Semi/Themes/Light/_index.axaml index c9f2bea..aa85239 100644 --- a/src/Ursa.Themes.Semi/Themes/Light/_index.axaml +++ b/src/Ursa.Themes.Semi/Themes/Light/_index.axaml @@ -5,6 +5,7 @@ + diff --git a/src/Ursa.Themes.Semi/Themes/Shared/DualBadge.axaml b/src/Ursa.Themes.Semi/Themes/Shared/DualBadge.axaml new file mode 100644 index 0000000..c9ef25a --- /dev/null +++ b/src/Ursa.Themes.Semi/Themes/Shared/DualBadge.axaml @@ -0,0 +1,2 @@ + + diff --git a/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml b/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml index 777a0a4..7bf0b4d 100644 --- a/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml +++ b/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml @@ -5,6 +5,7 @@ + diff --git a/src/Ursa/Controls/DualBadge.cs b/src/Ursa/Controls/DualBadge.cs new file mode 100644 index 0000000..94f9664 --- /dev/null +++ b/src/Ursa/Controls/DualBadge.cs @@ -0,0 +1,53 @@ +using Avalonia; +using Avalonia.Controls.Metadata; +using Avalonia.Controls.Presenters; +using Avalonia.Controls.Primitives; +using Avalonia.Controls.Templates; +using Avalonia.Media; + +namespace Ursa.Controls; + +[TemplatePart(PART_Icon, typeof(ContentPresenter))] +public class DualBadge : HeaderedContentControl +{ + public const string PART_HeaderPresenter = "PART_HeaderPresenter"; + public const string PART_ContentPresenter = "PART_ContentPresenter"; + public const string PART_Icon = "PART_Icon"; + + public static readonly StyledProperty IconProperty = + AvaloniaProperty.Register(nameof(Icon)); + + public object? Icon + { + get => GetValue(IconProperty); + set => SetValue(IconProperty, value); + } + + public static readonly StyledProperty IconTemplateProperty = + AvaloniaProperty.Register(nameof(IconTemplate)); + + public IDataTemplate? IconTemplate + { + get => GetValue(IconTemplateProperty); + set => SetValue(IconTemplateProperty, value); + } + + + public static readonly StyledProperty HeaderForegroundProperty = + AvaloniaProperty.Register(nameof(HeaderForeground)); + + public IBrush? HeaderForeground + { + get => GetValue(HeaderForegroundProperty); + set => SetValue(HeaderForegroundProperty, value); + } + + public static readonly StyledProperty HeaderBackgroundProperty = + AvaloniaProperty.Register(nameof(HeaderBackground)); + + public IBrush? HeaderBackground + { + get => GetValue(HeaderBackgroundProperty); + set => SetValue(HeaderBackgroundProperty, value); + } +} \ No newline at end of file