From de3adf033986657d59ba3c9b13115886f3890000 Mon Sep 17 00:00:00 2001 From: twice109 <3518499@qq.com> Date: Tue, 30 Dec 2025 10:53:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=91=84=E5=83=8F=E5=A4=B4?= =?UTF-8?q?=E4=B8=AD=E6=8E=A7=E5=8F=B0=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ayay.Solution.sln | 6 + SHH.CameraDashboard/App.xaml | 25 ++ SHH.CameraDashboard/App.xaml.cs | 14 + SHH.CameraDashboard/App/AppGlobalData.cs | 17 + SHH.CameraDashboard/App/ClipboardHelper.cs | 40 ++ SHH.CameraDashboard/App/ThemeManager.cs | 53 +++ SHH.CameraDashboard/App/WizardControl.xaml | 172 ++++++++ SHH.CameraDashboard/App/WizardControl.xaml.cs | 94 +++++ SHH.CameraDashboard/AssemblyInfo.cs | 10 + .../Controls/BottomDockControl.xaml | 67 ++++ .../Controls/BottomDockControl.xaml.cs | 64 +++ .../Controls/CameraListControl.xaml | 247 ++++++++++++ .../Controls/CameraListControl.xaml.cs | 148 +++++++ .../Controls/DeviceHomeControl.xaml | 199 +++++++++ .../Controls/DeviceHomeControl.xaml.cs | 52 +++ .../Controls/DiagnosticControl.xaml | 83 ++++ .../Controls/DiagnosticControl.xaml.cs | 106 +++++ SHH.CameraDashboard/MainWindow.xaml | 244 +++++++++++ SHH.CameraDashboard/MainWindow.xaml.cs | 107 +++++ SHH.CameraDashboard/Models/ApiLogEntry.cs | 25 ++ SHH.CameraDashboard/Models/CameraInfo.cs | 31 ++ SHH.CameraDashboard/Models/DeviceBrand.cs | 63 +++ SHH.CameraDashboard/Models/ServerNode.cs | 87 ++++ .../Models/VideoSourceStatus.cs | 60 +++ .../SHH.CameraDashboard.csproj | 38 ++ SHH.CameraDashboard/Services/HttpService.cs | 119 ++++++ .../Services/StorageService.cs | 52 +++ .../Style/Themes/Colors.Dark.xaml | 56 +++ .../Style/Themes/Colors.Light.xaml | 56 +++ SHH.CameraDashboard/Style/Themes/Sizes.xaml | 23 ++ SHH.CameraDashboard/Style/Themes/Styles.xaml | 378 ++++++++++++++++++ 31 files changed, 2736 insertions(+) create mode 100644 SHH.CameraDashboard/App.xaml create mode 100644 SHH.CameraDashboard/App.xaml.cs create mode 100644 SHH.CameraDashboard/App/AppGlobalData.cs create mode 100644 SHH.CameraDashboard/App/ClipboardHelper.cs create mode 100644 SHH.CameraDashboard/App/ThemeManager.cs create mode 100644 SHH.CameraDashboard/App/WizardControl.xaml create mode 100644 SHH.CameraDashboard/App/WizardControl.xaml.cs create mode 100644 SHH.CameraDashboard/AssemblyInfo.cs create mode 100644 SHH.CameraDashboard/Controls/BottomDockControl.xaml create mode 100644 SHH.CameraDashboard/Controls/BottomDockControl.xaml.cs create mode 100644 SHH.CameraDashboard/Controls/CameraListControl.xaml create mode 100644 SHH.CameraDashboard/Controls/CameraListControl.xaml.cs create mode 100644 SHH.CameraDashboard/Controls/DeviceHomeControl.xaml create mode 100644 SHH.CameraDashboard/Controls/DeviceHomeControl.xaml.cs create mode 100644 SHH.CameraDashboard/Controls/DiagnosticControl.xaml create mode 100644 SHH.CameraDashboard/Controls/DiagnosticControl.xaml.cs create mode 100644 SHH.CameraDashboard/MainWindow.xaml create mode 100644 SHH.CameraDashboard/MainWindow.xaml.cs create mode 100644 SHH.CameraDashboard/Models/ApiLogEntry.cs create mode 100644 SHH.CameraDashboard/Models/CameraInfo.cs create mode 100644 SHH.CameraDashboard/Models/DeviceBrand.cs create mode 100644 SHH.CameraDashboard/Models/ServerNode.cs create mode 100644 SHH.CameraDashboard/Models/VideoSourceStatus.cs create mode 100644 SHH.CameraDashboard/SHH.CameraDashboard.csproj create mode 100644 SHH.CameraDashboard/Services/HttpService.cs create mode 100644 SHH.CameraDashboard/Services/StorageService.cs create mode 100644 SHH.CameraDashboard/Style/Themes/Colors.Dark.xaml create mode 100644 SHH.CameraDashboard/Style/Themes/Colors.Light.xaml create mode 100644 SHH.CameraDashboard/Style/Themes/Sizes.xaml create mode 100644 SHH.CameraDashboard/Style/Themes/Styles.xaml diff --git a/Ayay.Solution.sln b/Ayay.Solution.sln index 0bedb48..e025631 100644 --- a/Ayay.Solution.sln +++ b/Ayay.Solution.sln @@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SHH.Contracts", "SHH.Contra EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SHH.NetMQ", "SHH.NetMQ\SHH.NetMQ.csproj", "{FAC8E0CD-4BB3-4752-A406-CD3D2CE5FBB4}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SHH.CameraDashboard", "SHH.CameraDashboard\SHH.CameraDashboard.csproj", "{03C249D7-BCF1-404D-AD09-7AB39BA263AD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -33,6 +35,10 @@ Global {FAC8E0CD-4BB3-4752-A406-CD3D2CE5FBB4}.Debug|Any CPU.Build.0 = Debug|Any CPU {FAC8E0CD-4BB3-4752-A406-CD3D2CE5FBB4}.Release|Any CPU.ActiveCfg = Release|Any CPU {FAC8E0CD-4BB3-4752-A406-CD3D2CE5FBB4}.Release|Any CPU.Build.0 = Release|Any CPU + {03C249D7-BCF1-404D-AD09-7AB39BA263AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03C249D7-BCF1-404D-AD09-7AB39BA263AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03C249D7-BCF1-404D-AD09-7AB39BA263AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03C249D7-BCF1-404D-AD09-7AB39BA263AD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SHH.CameraDashboard/App.xaml b/SHH.CameraDashboard/App.xaml new file mode 100644 index 0000000..6998269 --- /dev/null +++ b/SHH.CameraDashboard/App.xaml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/SHH.CameraDashboard/App.xaml.cs b/SHH.CameraDashboard/App.xaml.cs new file mode 100644 index 0000000..f60e5be --- /dev/null +++ b/SHH.CameraDashboard/App.xaml.cs @@ -0,0 +1,14 @@ +using System.Configuration; +using System.Data; +using System.Windows; + +namespace SHH.CameraDashboard +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + } + +} diff --git a/SHH.CameraDashboard/App/AppGlobalData.cs b/SHH.CameraDashboard/App/AppGlobalData.cs new file mode 100644 index 0000000..ca201f8 --- /dev/null +++ b/SHH.CameraDashboard/App/AppGlobalData.cs @@ -0,0 +1,17 @@ +namespace SHH.CameraDashboard +{ + // 2. 全局配置存储 + public static class AppGlobalData + { + public static List ActiveServerList { get; private set; } = new List(); + + public static void SaveConfig(IEnumerable nodes) + { + ActiveServerList.Clear(); + foreach (var node in nodes) + { + ActiveServerList.Add(new ServerNode { Ip = node.Ip, Port = node.Port }); + } + } + } +} \ No newline at end of file diff --git a/SHH.CameraDashboard/App/ClipboardHelper.cs b/SHH.CameraDashboard/App/ClipboardHelper.cs new file mode 100644 index 0000000..ef52861 --- /dev/null +++ b/SHH.CameraDashboard/App/ClipboardHelper.cs @@ -0,0 +1,40 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading; +using System.Windows; + +public static class ClipboardHelper +{ + /// + /// 安全复制文本,包含冲突重试机制 + /// + public static void SetText(string text) + { + if (string.IsNullOrEmpty(text)) return; + + // 最多尝试 5 次,每次间隔 100 毫秒 + for (int i = 0; i < 5; i++) + { + try + { + Clipboard.SetText(text); + return; // 复制成功,退出方法 + } + catch (COMException ex) + { + // 如果是剪贴板被占用错误,等待后重试 + if ((uint)ex.ErrorCode == 0x800401D0) + { + Thread.Sleep(100); + continue; + } + throw; // 其他 COM 错误则抛出 + } + catch (Exception) + { + if (i == 4) throw; // 最后一次尝试失败则抛出 + Thread.Sleep(100); + } + } + } +} \ No newline at end of file diff --git a/SHH.CameraDashboard/App/ThemeManager.cs b/SHH.CameraDashboard/App/ThemeManager.cs new file mode 100644 index 0000000..b0c24ef --- /dev/null +++ b/SHH.CameraDashboard/App/ThemeManager.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; + +namespace SHH.CameraDashboard +{ + public enum ThemeType { Dark, Light } + + public static class ThemeManager + { + public static void ChangeTheme(ThemeType theme) + { + var appResources = Application.Current.Resources; + + // 1. 找到旧的颜色字典并移除 + // 我们通过检查 Source 路径来识别它 + ResourceDictionary oldDict = null; + foreach (var dict in appResources.MergedDictionaries) + { + // 只要路径里包含 "Colors." 说明它是我们的皮肤文件 + if (dict.Source != null && dict.Source.OriginalString.Contains("Themes/Colors.")) + { + oldDict = dict; + break; + } + } + + if (oldDict != null) + { + appResources.MergedDictionaries.Remove(oldDict); + } + + // 2. 加载新字典 + string dictName = theme switch + { + ThemeType.Light => "/Style/Themes/Colors.Light.xaml", + ThemeType.Dark => "/Style/Themes/Colors.Dark.xaml", + _ => "/Style/Themes/Colors.Dark.xaml" // 默认 + }; + + var newDict = new ResourceDictionary + { + Source = new Uri(dictName, UriKind.Relative) + }; + + // 3. 添加到集合中 (建议加在最前面,或者根据索引位置) + appResources.MergedDictionaries.Add(newDict); + } + } +} diff --git a/SHH.CameraDashboard/App/WizardControl.xaml b/SHH.CameraDashboard/App/WizardControl.xaml new file mode 100644 index 0000000..11fb734 --- /dev/null +++ b/SHH.CameraDashboard/App/WizardControl.xaml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + +