From 0081ec8959f443698c9418c816613d68ef48c97d Mon Sep 17 00:00:00 2001
From: yaobiao131 <28655758+yaobiao131@users.noreply.github.com>
Date: Wed, 29 Oct 2025 21:03:42 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0QRCode?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Directory.Packages.props | 1 +
src/AtomUI.Controls/AtomUI.Controls.csproj | 1 +
.../AtomUIOSSControlThemesProvider.axaml | 1 +
src/AtomUI.Controls/QRCode/QRCode.cs | 272 ++++++++++++++++++
src/AtomUI.Controls/QRCode/QRCodeToken.cs | 31 ++
.../QRCode/Themes/QRCodeTheme.axaml | 86 ++++++
6 files changed, 392 insertions(+)
create mode 100644 src/AtomUI.Controls/QRCode/QRCode.cs
create mode 100644 src/AtomUI.Controls/QRCode/QRCodeToken.cs
create mode 100644 src/AtomUI.Controls/QRCode/Themes/QRCodeTheme.axaml
diff --git a/Directory.Packages.props b/Directory.Packages.props
index aea3e0c7f..f8369dfbb 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -14,6 +14,7 @@
+
diff --git a/src/AtomUI.Controls/AtomUI.Controls.csproj b/src/AtomUI.Controls/AtomUI.Controls.csproj
index 46c6ae2e8..16f9dea4f 100644
--- a/src/AtomUI.Controls/AtomUI.Controls.csproj
+++ b/src/AtomUI.Controls/AtomUI.Controls.csproj
@@ -16,6 +16,7 @@
+
diff --git a/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml b/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml
index 6b125ab63..363ac14ae 100644
--- a/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml
+++ b/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml
@@ -43,6 +43,7 @@
+
diff --git a/src/AtomUI.Controls/QRCode/QRCode.cs b/src/AtomUI.Controls/QRCode/QRCode.cs
new file mode 100644
index 000000000..a42af4b29
--- /dev/null
+++ b/src/AtomUI.Controls/QRCode/QRCode.cs
@@ -0,0 +1,272 @@
+using System.Reactive.Disposables;
+using AtomUI.Theme;
+using AtomUI.Theme.Data;
+using AtomUI.Theme.Styling;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+using Avalonia.Controls.Templates;
+using Avalonia.Interactivity;
+using Avalonia.Media;
+using Avalonia.Media.Imaging;
+using Avalonia.Media.Immutable;
+using SkiaSharp;
+using SkiaSharp.QrCode;
+using static System.Enum;
+
+namespace AtomUI.Controls;
+
+///
+/// 二维码纠错等级
+///
+public enum QRCodeEccLevel
+{
+ L = 0,
+ M = 1,
+ Q = 2,
+ H = 3
+}
+
+///
+/// QRCode状态
+///
+public enum QRCodeStatus
+{
+ Active = 0,
+ Expired,
+ Loading,
+ Scanned,
+}
+
+public class QRCode : TemplatedControl,
+ IControlSharedTokenResourcesHost
+{
+ #region 公共属性定义
+
+ public static readonly StyledProperty ValueProperty =
+ AvaloniaProperty.Register(nameof(Value));
+
+ public static readonly StyledProperty BorderedProperty =
+ AvaloniaProperty.Register(nameof(Bordered), true);
+
+ public static readonly StyledProperty ColorProperty =
+ AvaloniaProperty.Register(nameof(Color), new ImmutableSolidColorBrush(Colors.Black));
+
+ public static readonly StyledProperty BgColorProperty =
+ AvaloniaProperty.Register(nameof(BgColor), new ImmutableSolidColorBrush(Colors.Transparent));
+
+ public static readonly StyledProperty EccLevelProperty =
+ AvaloniaProperty.Register(nameof(EccLevel), QRCodeEccLevel.M);
+
+ public static readonly StyledProperty SizeProperty =
+ AvaloniaProperty.Register(nameof(Size), 160);
+
+ public static readonly StyledProperty IconSizeProperty =
+ AvaloniaProperty.Register(nameof(IconSize), 40);
+
+ public static readonly StyledProperty IconProperty =
+ AvaloniaProperty.Register(nameof(Icon));
+
+ public static readonly StyledProperty IconBgColorProperty =
+ AvaloniaProperty.Register(nameof(IconBgColor));
+
+ public static readonly StyledProperty StatusProperty =
+ AvaloniaProperty.Register(nameof(Status));
+
+ public static readonly StyledProperty