From 0d790bbd80fe8557350c91adc1247fdcb5d89510 Mon Sep 17 00:00:00 2001 From: CJK_mkp <113243675+CJKmkp@users.noreply.github.com> Date: Sat, 1 Nov 2025 20:42:18 +0800 Subject: [PATCH] =?UTF-8?q?add:=E5=A2=A8=E8=BF=B9=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/MainWindow.xaml | 24 +++++++++ Ink Canvas/MainWindow.xaml.cs | 1 + Ink Canvas/MainWindow_cs/MW_Settings.cs | 23 +++++++++ Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs | 17 +++++++ Ink Canvas/MainWindow_cs/MW_Timer.cs | 50 +++++++++++++++++++ Ink Canvas/Resources/Settings.cs | 6 +++ 6 files changed, 121 insertions(+) diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml index 93032d3e..d910da66 100644 --- a/Ink Canvas/MainWindow.xaml +++ b/Ink Canvas/MainWindow.xaml @@ -3083,6 +3083,30 @@ Toggled="ToggleSwitchAutoSaveStrokesAtScreenshot_Toggled" /> + + + + + + + + + + + + + + + + + + diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index d0f2ceaf..5e9b8d14 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -1853,6 +1853,7 @@ namespace Ink_Canvas // 添加定时器来维护置顶状态 private DispatcherTimer topmostMaintenanceTimer; + private DispatcherTimer autoSaveStrokesTimer; private bool isTopmostMaintenanceEnabled; private void ApplyNoFocusMode() diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs index 4624ac44..9f7b9907 100644 --- a/Ink Canvas/MainWindow_cs/MW_Settings.cs +++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs @@ -1877,6 +1877,29 @@ namespace Ink_Canvas SaveSettingsToFile(); } + private void ToggleSwitchEnableAutoSaveStrokes_Toggled(object sender, RoutedEventArgs e) + { + if (!isLoaded) return; + Settings.Automation.IsEnableAutoSaveStrokes = ToggleSwitchEnableAutoSaveStrokes.IsOn; + SaveSettingsToFile(); + // 更新定时器状态 + UpdateAutoSaveStrokesTimer(); + } + + private void ComboBoxAutoSaveStrokesInterval_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (!isLoaded || ComboBoxAutoSaveStrokesInterval.SelectedItem == null) return; + + var selectedItem = ComboBoxAutoSaveStrokesInterval.SelectedItem as System.Windows.Controls.ComboBoxItem; + if (selectedItem?.Tag != null && int.TryParse(selectedItem.Tag.ToString(), out int intervalMinutes)) + { + Settings.Automation.AutoSaveStrokesIntervalMinutes = intervalMinutes; + SaveSettingsToFile(); + // 更新定时器间隔 + UpdateAutoSaveStrokesTimer(); + } + } + #endregion #region Gesture diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs index 85e8ec86..0e51b58f 100644 --- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs +++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs @@ -1053,6 +1053,23 @@ namespace Ink_Canvas ToggleSwitchSaveFullPageStrokes.IsOn = Settings.Automation.IsSaveFullPageStrokes; + // 加载定时保存墨迹设置 + ToggleSwitchEnableAutoSaveStrokes.IsOn = Settings.Automation.IsEnableAutoSaveStrokes; + // 初始化保存间隔下拉框 + if (ComboBoxAutoSaveStrokesInterval != null) + { + int intervalMinutes = Settings.Automation.AutoSaveStrokesIntervalMinutes; + if (intervalMinutes < 1) intervalMinutes = 5; // 默认5分钟 + foreach (System.Windows.Controls.ComboBoxItem item in ComboBoxAutoSaveStrokesInterval.Items) + { + if (item.Tag != null && int.TryParse(item.Tag.ToString(), out int tagValue) && tagValue == intervalMinutes) + { + ComboBoxAutoSaveStrokesInterval.SelectedItem = item; + break; + } + } + } + SideControlMinimumAutomationSlider.Value = Settings.Automation.MinimumAutomationStrokeNumber; AutoSavedStrokesLocation.Text = Settings.Automation.AutoSavedStrokesLocation; diff --git a/Ink Canvas/MainWindow_cs/MW_Timer.cs b/Ink Canvas/MainWindow_cs/MW_Timer.cs index afb21c29..3de74f33 100644 --- a/Ink Canvas/MainWindow_cs/MW_Timer.cs +++ b/Ink Canvas/MainWindow_cs/MW_Timer.cs @@ -12,6 +12,7 @@ using System.Threading.Tasks; using System.Timers; using System.Windows; using System.Windows.Controls; +using System.Windows.Threading; namespace Ink_Canvas { @@ -148,6 +149,55 @@ namespace Ink_Canvas LogHelper.WriteLogToFile($"程序启动时NTP同步失败: {ex.Message}", LogHelper.LogType.Error); } }); + + // 初始化定时保存墨迹定时器 + InitAutoSaveStrokesTimer(); + } + + // 初始化定时保存墨迹定时器 + private void InitAutoSaveStrokesTimer() + { + if (autoSaveStrokesTimer == null) + { + autoSaveStrokesTimer = new DispatcherTimer(); + autoSaveStrokesTimer.Tick += AutoSaveStrokesTimer_Tick; + } + + // 根据设置更新定时器间隔和启动状态 + UpdateAutoSaveStrokesTimer(); + } + + // 更新定时保存墨迹定时器状态 + private void UpdateAutoSaveStrokesTimer() + { + if (autoSaveStrokesTimer == null) return; + + autoSaveStrokesTimer.Stop(); + + if (Settings.Automation.IsEnableAutoSaveStrokes) + { + int intervalMinutes = Settings.Automation.AutoSaveStrokesIntervalMinutes; + if (intervalMinutes < 1) intervalMinutes = 1; // 最小间隔1分钟 + autoSaveStrokesTimer.Interval = TimeSpan.FromMinutes(intervalMinutes); + autoSaveStrokesTimer.Start(); + } + } + + // 定时保存墨迹定时器事件处理 + private void AutoSaveStrokesTimer_Tick(object sender, EventArgs e) + { + try + { + // 只有在画布可见且有墨迹时才保存 + if (inkCanvas.Visibility == Visibility.Visible && inkCanvas.Strokes.Count > 0) + { + // 静默保存 + SaveInkCanvasStrokes(false, false); + } + } + catch (Exception) + { + } } // NTP同步定时器事件处理 diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs index 395ea46d..ed819bd1 100644 --- a/Ink Canvas/Resources/Settings.cs +++ b/Ink Canvas/Resources/Settings.cs @@ -462,6 +462,12 @@ namespace Ink_Canvas [JsonProperty("isAutoEnterAnnotationAfterKillHite")] public bool IsAutoEnterAnnotationAfterKillHite { get; set; } + [JsonProperty("isEnableAutoSaveStrokes")] + public bool IsEnableAutoSaveStrokes { get; set; } = true; + + [JsonProperty("autoSaveStrokesIntervalMinutes")] + public int AutoSaveStrokesIntervalMinutes { get; set; } = 5; + [JsonProperty("floatingWindowInterceptor")] public FloatingWindowInterceptorSettings FloatingWindowInterceptor { get; set; } = new FloatingWindowInterceptorSettings(); }