From fbfac18ca073ae70b2b6fa29b34066d9918dac05 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Fri, 2 Jan 2026 12:22:50 +0800 Subject: [PATCH] =?UTF-8?q?add:=E6=96=B0=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SettingsViews/AboutPanel.xaml | 18 +- .../SettingsViews/AboutPanel.xaml.cs | 295 +++++++- .../SettingsViews/AdvancedPanel.xaml | 149 ++-- .../SettingsViews/AdvancedPanel.xaml.cs | 241 +++---- .../SettingsViews/AppearancePanel.xaml | 48 +- .../SettingsViews/AppearancePanel.xaml.cs | 109 ++- .../SettingsViews/AutomationPanel.xaml | 47 +- .../SettingsViews/AutomationPanel.xaml.cs | 41 +- .../SettingsViews/CanvasAndInkPanel.xaml | 188 +++--- .../SettingsViews/CanvasAndInkPanel.xaml.cs | 244 ++----- .../SettingsViews/ComboBoxStyles.xaml | 4 +- .../SettingsViews/CrashActionPanel.xaml.cs | 11 +- .../FloatingBarDnDSettingsPanel.xaml.cs | 14 +- .../SettingsViews/GesturesPanel.xaml | 9 +- .../SettingsViews/GesturesPanel.xaml.cs | 102 +-- .../SettingsViews/InkRecognitionPanel.xaml | 28 +- .../SettingsViews/InkRecognitionPanel.xaml.cs | 120 ++-- .../SettingsViews/LuckyRandomPanel.xaml | 21 +- .../SettingsViews/LuckyRandomPanel.xaml.cs | 116 +--- .../SettingsViews/MainWindowSettingsHelper.cs | 239 +------ .../SettingsViews/PowerPointPanel.xaml | 76 ++- .../SettingsViews/PowerPointPanel.xaml.cs | 360 ++++++---- .../SettingsViews/SearchPanel.xaml | 8 - .../SettingsViews/SearchPanel.xaml.cs | 113 +--- .../SettingsViews/SettingsBaseView.xaml.cs | 12 +- .../SettingsViews/SettingsPanelBase.cs | 71 +- .../SettingsViews/ShortcutsPanel.xaml | 1 - .../SettingsViews/ShortcutsPanel.xaml.cs | 11 +- .../SettingsViews/SnapshotPanel.xaml | 139 ++-- .../SettingsViews/SnapshotPanel.xaml.cs | 296 ++++---- .../SettingsViews/StartupPanel.xaml | 26 +- .../SettingsViews/StartupPanel.xaml.cs | 215 +----- .../SettingsViews/StoragePanel.xaml | 1 - .../SettingsViews/StoragePanel.xaml.cs | 11 +- .../SettingsViews/ThemeHelper.cs | 638 ++++++++---------- .../SettingsViews/ThemePanel.xaml | 38 +- .../SettingsViews/ThemePanel.xaml.cs | 175 +---- .../SettingsViews/TimerPanel.xaml | 23 +- .../SettingsViews/TimerPanel.xaml.cs | 109 +-- .../Windows/SettingsViews/SettingsWindow.xaml | 26 - .../SettingsViews/SettingsWindow.xaml.cs | 192 ++++-- 41 files changed, 1982 insertions(+), 2603 deletions(-) diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/AboutPanel.xaml b/Ink Canvas/Windows/SettingsViews/SettingsViews/AboutPanel.xaml index a74ffefa..a121f9ae 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/AboutPanel.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/AboutPanel.xaml @@ -73,8 +73,8 @@ - - + + @@ -84,8 +84,8 @@ - - + + @@ -119,7 +119,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -146,7 +146,7 @@ - + @@ -164,7 +164,7 @@ - + @@ -181,7 +181,7 @@ - + diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/AboutPanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/AboutPanel.xaml.cs index ec925479..bef1d438 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/AboutPanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/AboutPanel.xaml.cs @@ -1,7 +1,9 @@ using iNKORE.UI.WPF.Helpers; +using Ink_Canvas.Helpers; using OSVersionExtension; using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Management; using System.Reflection; @@ -17,16 +19,14 @@ using System.Windows.Media.Imaging; namespace Ink_Canvas.Windows.SettingsViews { - /// - /// AboutPanel.xaml 的交互逻辑 - /// public partial class AboutPanel : UserControl { public AboutPanel() { InitializeComponent(); - // 关于页面图片横幅 + Loaded += AboutPanel_Loaded; + if (File.Exists(App.RootPath + "icc-about-illustrations.png")) { try @@ -42,8 +42,22 @@ namespace Ink_Canvas.Windows.SettingsViews CopyrightBannerImage.Visibility = Visibility.Collapsed; } - // 关于页面构建时间 - var buildTime = FileBuildTimeHelper.GetBuildDateTime(Assembly.GetExecutingAssembly()); + try + { + var assembly = Assembly.GetExecutingAssembly(); + var version = assembly.GetName().Version; + var assemblyTitle = assembly.GetCustomAttribute()?.Title ?? "InkCanvasForClass"; + AboutSoftwareVersion.Text = $"{assemblyTitle} v{version.Major}.{version.Minor}.{version.Build}.{version.Revision}"; + } + catch + { + AboutSoftwareVersion.Text = "InkCanvasForClass v1.7.18.0"; + } + + UpdateSystemInfo(); + + // 以下残留代码已移至 UpdateSystemInfo() 方法,应删除 + /* if (buildTime != null) { var bt = ((DateTimeOffset)buildTime).LocalDateTime; @@ -56,18 +70,115 @@ namespace Ink_Canvas.Windows.SettingsViews $"build-{bt.Year}-{m}-{d}-{h}:{min}:{s}"; } - // 关于页面系统版本 AboutSystemVersion.Text = $"{OSVersion.GetOperatingSystem()} {OSVersion.GetOSVersion().Version}"; - // 关于页面触摸设备 var _t_touch = new Thread(() => { var touchcount = TouchTabletDetectHelper.GetTouchTabletDevices().Count; var support = TouchTabletDetectHelper.IsTouchEnabled(); Dispatcher.BeginInvoke(() => - AboutTouchTabletText.Text = $"{touchcount}个设备,{(support ? "支持触摸设备" : "无触摸支持")}"); + AboutTouchTabletText.Text = $"{touchcount}���豸��{(support ? "֧�ִ����豸" : "�޴���֧��")}"); }); _t_touch.Start(); + */ + + try + { + var assembly = Assembly.GetExecutingAssembly(); + var copyright = assembly.GetCustomAttribute()?.Copyright ?? "? Copyright 2024-2026"; + AboutCopyright.Text = copyright; + + if (AboutBottomCopyright != null) + { + var company = assembly.GetCustomAttribute()?.Company ?? ""; + if (!string.IsNullOrEmpty(company)) + { + AboutBottomCopyright.Text = $"{copyright} {company} ����"; + } + else + { + AboutBottomCopyright.Text = copyright; + } + } + } + catch + { + AboutCopyright.Text = "? Copyright 2024-2026"; + if (AboutBottomCopyright != null) + { + AboutBottomCopyright.Text = "? Copyright 2024-2026"; + } + } + + if (AboutUserCopyright != null) + { + try + { + var deviceId = DeviceIdentifier.GetDeviceId(); + AboutUserCopyright.Text = deviceId; + } + catch + { + AboutUserCopyright.Text = "获取设备ID失败"; + } + } + + SetupLinkClickHandlers(); + + UpdateLinkColors(); + } + + private void SetupLinkClickHandlers() + { + if (AboutOfficialWebsiteLink != null) + { + AboutOfficialWebsiteLink.MouseLeftButtonDown += (s, e) => + { + OpenUrlInBrowser("https://forum.smart-teach.cn/t/icc-ce"); + }; + AboutOfficialWebsiteLink.Cursor = Cursors.Hand; + } + + if (AboutGithubLink != null) + { + AboutGithubLink.MouseLeftButtonDown += (s, e) => + { + OpenUrlInBrowser("https://github.com/InkCanvasForClass/community"); + }; + AboutGithubLink.Cursor = Cursors.Hand; + } + + if (AboutContributorsLink != null) + { + AboutContributorsLink.MouseLeftButtonDown += (s, e) => + { + OpenUrlInBrowser("https://github.com/InkCanvasForClass/community#贡献者"); + }; + AboutContributorsLink.Cursor = Cursors.Hand; + } + } + + private void OpenUrlInBrowser(string url) + { + try + { + Process.Start(new ProcessStartInfo + { + FileName = url, + UseShellExecute = true + }); + } + catch (Exception ex) + { + try + { + Process.Start("cmd", $"/c start {url}"); + } + catch + { + System.Diagnostics.Debug.WriteLine($"�޷�������: {url}, ����: {ex.Message}"); + } + } } public static class TouchTabletDetectHelper @@ -143,8 +254,8 @@ namespace Ink_Canvas.Windows.SettingsViews { fileStream.Position = 0x3C; fileStream.Read(buffer, 0, 4); - fileStream.Position = BitConverter.ToUInt32(buffer, 0); // COFF header offset - fileStream.Read(buffer, 0, 4); // "PE\0\0" + fileStream.Position = BitConverter.ToUInt32(buffer, 0); + fileStream.Read(buffer, 0, 4); fileStream.Read(buffer, 0, buffer.Length); } var pinnedBuffer = GCHandle.Alloc(buffer, GCHandleType.Pinned); @@ -259,19 +370,171 @@ namespace Ink_Canvas.Windows.SettingsViews var border = thumb.Template.FindName("ScrollbarThumbEx", thumb); ((Border)border).Background = new SolidColorBrush(Color.FromRgb(138, 138, 138)); } - - /// - /// 应用主题 - /// public void ApplyTheme() { try { ThemeHelper.ApplyThemeToControl(this); + UpdateLinkColors(); } catch (Exception ex) { - System.Diagnostics.Debug.WriteLine($"AboutPanel 应用主题时出错: {ex.Message}"); + System.Diagnostics.Debug.WriteLine($"AboutPanel Ӧ������ʱ����: {ex.Message}"); + } + } + + private void UpdateLinkColors() + { + var linkColor = ThemeHelper.IsDarkTheme + ? Color.FromRgb(96, 205, 255) + : Color.FromRgb(29, 78, 216); + + if (AboutOfficialWebsiteLink != null) + { + AboutOfficialWebsiteLink.Foreground = new SolidColorBrush(linkColor); + } + if (AboutGithubLink != null) + { + AboutGithubLink.Foreground = new SolidColorBrush(linkColor); + } + if (AboutContributorsLink != null) + { + AboutContributorsLink.Foreground = new SolidColorBrush(linkColor); + } + } + + private void AboutPanel_Loaded(object sender, RoutedEventArgs e) + { + UpdateSystemInfo(); + } + + private void UpdateSystemInfo() + { + UpdateUpdateIconVisibility(); + + try + { + AboutSystemVersion.Text = $"{OSVersion.GetOperatingSystem()} {OSVersion.GetOSVersion().Version}"; + } + catch + { + AboutSystemVersion.Text = "未知系统版本"; + } + + try + { + var buildTime = FileBuildTimeHelper.GetBuildDateTime(Assembly.GetExecutingAssembly()); + if (buildTime != null) + { + var bt = ((DateTimeOffset)buildTime).LocalDateTime; + var m = bt.Month.ToString().PadLeft(2, '0'); + var d = bt.Day.ToString().PadLeft(2, '0'); + var h = bt.Hour.ToString().PadLeft(2, '0'); + var min = bt.Minute.ToString().PadLeft(2, '0'); + var s = bt.Second.ToString().PadLeft(2, '0'); + AboutBuildTime.Text = $"build-{bt.Year}-{m}-{d}-{h}:{min}:{s}"; + } + } + catch + { + AboutBuildTime.Text = "build-未知"; + } + + var _t_touch = new Thread(() => + { + try + { + var touchcount = TouchTabletDetectHelper.GetTouchTabletDevices().Count; + var support = TouchTabletDetectHelper.IsTouchEnabled(); + Dispatcher.BeginInvoke(() => + AboutTouchTabletText.Text = $"{touchcount}个设备,{(support ? "支持触摸设备" : "无触摸支持")}"); + } + catch + { + Dispatcher.BeginInvoke(() => + AboutTouchTabletText.Text = "检测失败"); + } + }); + _t_touch.Start(); + + try + { + if (AboutUserCopyright != null) + { + var deviceId = DeviceIdentifier.GetDeviceId(); + AboutUserCopyright.Text = deviceId; + } + } + catch + { + if (AboutUserCopyright != null) + { + AboutUserCopyright.Text = "获取设备ID失败"; + } + } + } + + private void UpdateUpdateIconVisibility() + { + try + { + if (UpdateAvailableIcon != null) + { + bool hasUpdate = false; + try + { + var mainWindow = Application.Current.MainWindow as MainWindow; + if (mainWindow != null) + { + var hasNewUpdateProperty = mainWindow.GetType().GetProperty("HasNewUpdate"); + if (hasNewUpdateProperty != null) + { + hasUpdate = (bool)(hasNewUpdateProperty.GetValue(mainWindow) ?? false); + } + else + { + var updateInfoProperty = mainWindow.GetType().GetProperty("UpdateInfo"); + if (updateInfoProperty != null) + { + var updateInfo = updateInfoProperty.GetValue(mainWindow); + if (updateInfo != null) + { + var hasUpdateProperty = updateInfo.GetType().GetProperty("HasUpdate"); + if (hasUpdateProperty != null) + { + hasUpdate = (bool)(hasUpdateProperty.GetValue(updateInfo) ?? false); + } + } + } + } + } + } + catch + { + try + { + var mainWindow = Application.Current.MainWindow as MainWindow; + if (mainWindow != null) + { + var hasUpdateProperty = mainWindow.GetType().GetProperty("HasUpdate"); + if (hasUpdateProperty != null) + { + hasUpdate = (bool)(hasUpdateProperty.GetValue(mainWindow) ?? false); + } + } + } + catch { } + } + + UpdateAvailableIcon.Visibility = hasUpdate ? Visibility.Visible : Visibility.Collapsed; + } + } + catch + { + if (UpdateAvailableIcon != null) + { + UpdateAvailableIcon.Visibility = Visibility.Collapsed; + } } } } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml b/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml index 0f7d72cf..e5002f37 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml @@ -12,7 +12,6 @@ - -