From 860dc43c8d5d946d8fffab9c65762526274d04c6 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 2 May 2026 10:06:21 +0800 Subject: [PATCH] improve:UI --- Ink Canvas/Properties/Strings.en-US.resx | 59 ++++++++++++++++++- Ink Canvas/Properties/Strings.resx | 57 ++++++++++++++++++ Ink Canvas/Windows/HotkeyItem.xaml | 3 +- Ink Canvas/Windows/HotkeyItem.xaml.cs | 3 +- .../Helpers/MainWindowSettingsHelper.cs | 8 +-- .../Pages/AppearancePage.xaml.cs | 37 +++++++++--- .../SettingsViews/Pages/AutomationPage.xaml | 24 ++++---- .../SettingsViews/Pages/CanvasPage.xaml.cs | 10 +++- .../SettingsViews/Pages/DebugPage.xaml | 5 +- .../Pages/RandomDrawPage.xaml.cs | 28 +++++++-- .../Windows/SettingsViews/SettingsWindow.xaml | 8 +-- .../SettingsViews/SettingsWindow.xaml.cs | 6 +- 12 files changed, 202 insertions(+), 46 deletions(-) diff --git a/Ink Canvas/Properties/Strings.en-US.resx b/Ink Canvas/Properties/Strings.en-US.resx index 41553132..ad3535a9 100644 --- a/Ink Canvas/Properties/Strings.en-US.resx +++ b/Ink Canvas/Properties/Strings.en-US.resx @@ -2737,7 +2737,22 @@ Hide Logs - .txt logs and crash reports under Logs / Crashs. Cleanable. + .txt logs and crash reports under Logs / Crashes. Cleanable. + + + Not set + + + Security + + + Security password and process protection + + + Hotkeys + + + Hotkey settings Ink @@ -2799,4 +2814,46 @@ Hide View and clean storage used by ICC CE + + Show debug console + + + Show a separate console window for live log output (takes effect immediately; if "Enable logging" is off in settings, no content will be emitted). + + + Use custom save file name + + + When enabled, choose how saved files are named + + + File name format + + + Timestamp (default) + + + Date + + + Date + Time + + + Date + Mode + + + Date + Mode + Page + + + Date + Mode + Page + Stroke count + + + Custom... + + + Custom template + + + Available placeholders: {date} {time} {datetime} {mode} {page} {count} {type} + \ No newline at end of file diff --git a/Ink Canvas/Properties/Strings.resx b/Ink Canvas/Properties/Strings.resx index 05a3434b..f814cae4 100644 --- a/Ink Canvas/Properties/Strings.resx +++ b/Ink Canvas/Properties/Strings.resx @@ -2782,6 +2782,21 @@ 位于 Logs / Crashs 目录下的 .txt 日志与崩溃报告,可清理 + + 未设置 + + + 安全 + + + 安全密码与进程保护 + + + 快捷键 + + + 快捷键设置 + 墨迹 @@ -2842,4 +2857,46 @@ 查看与清理 ICC CE 占用的存储空间 + + 显示调试窗口 + + + 显示一个独立的控制台窗口,用于实时输出日志(开启后立即生效;关闭设置中的“启用日志记录”将不会输出内容)。 + + + 使用自定义保存文件名 + + + 开启后可选择保存文件的命名方式 + + + 文件名格式 + + + 时间戳(默认) + + + 日期 + + + 日期 + 时间 + + + 日期 + 模式 + + + 日期 + 模式 + 页码 + + + 日期 + 模式 + 页码 + 笔画数 + + + 自定义... + + + 自定义模板 + + + 可用占位符:{date} {time} {datetime} {mode} {page} {count} {type} + \ No newline at end of file diff --git a/Ink Canvas/Windows/HotkeyItem.xaml b/Ink Canvas/Windows/HotkeyItem.xaml index 89d8d54e..6e6b46c2 100644 --- a/Ink Canvas/Windows/HotkeyItem.xaml +++ b/Ink Canvas/Windows/HotkeyItem.xaml @@ -5,6 +5,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern" xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf" + xmlns:i18n="clr-namespace:Ink_Canvas.MarkupExtensions" mc:Ignorable="d" d:DesignHeight="68" d:DesignWidth="600"> @@ -20,7 +21,7 @@ FontFamily="Consolas" FontWeight="SemiBold" Click="BtnSetHotkey_Click"> - + \ No newline at end of file diff --git a/Ink Canvas/Windows/HotkeyItem.xaml.cs b/Ink Canvas/Windows/HotkeyItem.xaml.cs index 63cda413..96f7056c 100644 --- a/Ink Canvas/Windows/HotkeyItem.xaml.cs +++ b/Ink Canvas/Windows/HotkeyItem.xaml.cs @@ -1,3 +1,4 @@ +using Ink_Canvas.Helpers; using System; using System.Windows; using System.Windows.Controls; @@ -68,7 +69,7 @@ namespace Ink_Canvas.Windows { if (_currentKey == Key.None) { - CurrentHotkeyTextBlock.Text = "未设置"; + CurrentHotkeyTextBlock.Text = LocalizationHelper.GetString("Hotkey_NotSet"); } else { diff --git a/Ink Canvas/Windows/SettingsViews/Helpers/MainWindowSettingsHelper.cs b/Ink Canvas/Windows/SettingsViews/Helpers/MainWindowSettingsHelper.cs index a8aacd5d..c0df8820 100644 --- a/Ink Canvas/Windows/SettingsViews/Helpers/MainWindowSettingsHelper.cs +++ b/Ink Canvas/Windows/SettingsViews/Helpers/MainWindowSettingsHelper.cs @@ -339,14 +339,12 @@ namespace Ink_Canvas.Windows.SettingsViews.Helpers }; bool isThemeRelated = false; - string controlNameLower = controlName.ToLower(); foreach (var themeControl in themeRelatedControls) { - string themeControlLower = themeControl.ToLower(); - if (controlNameLower.Contains(themeControlLower) || - themeControlLower.Contains(controlNameLower) || - controlNameLower == themeControlLower) + // OrdinalIgnoreCase 避免在循环里反复 ToLower() 生成中间字符串。 + if (controlName.IndexOf(themeControl, StringComparison.OrdinalIgnoreCase) >= 0 || + themeControl.IndexOf(controlName, StringComparison.OrdinalIgnoreCase) >= 0) { isThemeRelated = true; break; diff --git a/Ink Canvas/Windows/SettingsViews/Pages/AppearancePage.xaml.cs b/Ink Canvas/Windows/SettingsViews/Pages/AppearancePage.xaml.cs index befe7f63..a3b317f0 100644 --- a/Ink Canvas/Windows/SettingsViews/Pages/AppearancePage.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/Pages/AppearancePage.xaml.cs @@ -228,8 +228,14 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages private void ViewboxFloatingBarScaleTransformValueSlider_ValueChanged(object sender, RoutedEventArgs e) { if (!_isLoaded) return; - var val = Math.Round(ViewboxFloatingBarScaleTransformValueSlider.Value, 2); - ViewboxFloatingBarScaleTransformValueSlider.Value = val; + var slider = ViewboxFloatingBarScaleTransformValueSlider; + var val = Math.Round(slider.Value, 2); + // 仅当四舍五入纠正了显示值时才回写;那次 set 会重入 ValueChanged 完成保存。 + if (slider.Value != val) + { + slider.Value = val; + return; + } SettingsManager.Settings.Appearance.ViewboxFloatingBarScaleTransformValue = val; SettingsManager.SaveSettingsToFile(); var mw = GetMainWindow(); @@ -247,8 +253,13 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages private void ViewboxFloatingBarOpacityValueSlider_ValueChanged(object sender, RoutedEventArgs e) { if (!_isLoaded) return; - var val = Math.Round(ViewboxFloatingBarOpacityValueSlider.Value, 2); - ViewboxFloatingBarOpacityValueSlider.Value = val; + var slider = ViewboxFloatingBarOpacityValueSlider; + var val = Math.Round(slider.Value, 2); + if (slider.Value != val) + { + slider.Value = val; + return; + } SettingsManager.Settings.Appearance.ViewboxFloatingBarOpacityValue = val; SettingsManager.SaveSettingsToFile(); var mw = GetMainWindow(); @@ -258,8 +269,13 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages private void ViewboxFloatingBarOpacityInPPTValueSlider_ValueChanged(object sender, RoutedEventArgs e) { if (!_isLoaded) return; - var val = Math.Round(ViewboxFloatingBarOpacityInPPTValueSlider.Value, 2); - ViewboxFloatingBarOpacityInPPTValueSlider.Value = val; + var slider = ViewboxFloatingBarOpacityInPPTValueSlider; + var val = Math.Round(slider.Value, 2); + if (slider.Value != val) + { + slider.Value = val; + return; + } SettingsManager.Settings.Appearance.ViewboxFloatingBarOpacityInPPTValue = val; SettingsManager.SaveSettingsToFile(); var mw = GetMainWindow(); @@ -290,8 +306,13 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages private void ViewboxBlackBoardScaleTransformValueSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { if (!_isLoaded) return; - var val = Math.Round(ViewboxBlackBoardScaleTransformValueSlider.Value, 2); - ViewboxBlackBoardScaleTransformValueSlider.Value = val; + var slider = ViewboxBlackBoardScaleTransformValueSlider; + var val = Math.Round(slider.Value, 2); + if (slider.Value != val) + { + slider.Value = val; + return; + } SettingsManager.Settings.Appearance.ViewboxBlackBoardScaleTransformValue = val; SettingsManager.SaveSettingsToFile(); var mw = GetMainWindow(); diff --git a/Ink Canvas/Windows/SettingsViews/Pages/AutomationPage.xaml b/Ink Canvas/Windows/SettingsViews/Pages/AutomationPage.xaml index 349fe365..a536648c 100644 --- a/Ink Canvas/Windows/SettingsViews/Pages/AutomationPage.xaml +++ b/Ink Canvas/Windows/SettingsViews/Pages/AutomationPage.xaml @@ -373,30 +373,30 @@ Toggled="ToggleSwitchSaveFullPageStrokes_Toggled"/> - + - - - - - - - + + + + + + + e) { if (!_isLoaded) return; - var val = Math.Round(BrushAutoRestoreWidthSlider.Value, 2); - BrushAutoRestoreWidthSlider.Value = val; + var slider = BrushAutoRestoreWidthSlider; + var val = Math.Round(slider.Value, 2); + // 仅在四舍五入纠正了显示值时回写;那次 set 会重入 ValueChanged 完成保存。 + if (slider.Value != val) + { + slider.Value = val; + return; + } SettingsManager.Settings.Canvas.BrushAutoRestoreWidth = val; SettingsManager.SaveSettingsToFile(); } diff --git a/Ink Canvas/Windows/SettingsViews/Pages/DebugPage.xaml b/Ink Canvas/Windows/SettingsViews/Pages/DebugPage.xaml index 50f5540b..50842bda 100644 --- a/Ink Canvas/Windows/SettingsViews/Pages/DebugPage.xaml +++ b/Ink Canvas/Windows/SettingsViews/Pages/DebugPage.xaml @@ -8,6 +8,7 @@ xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:controls="clr-namespace:Ink_Canvas.Controls;assembly=InkCanvas.Controls" + xmlns:i18n="clr-namespace:Ink_Canvas.MarkupExtensions" mc:Ignorable="d" Title="Debug"> @@ -32,8 +33,8 @@ Text="Debug" /> diff --git a/Ink Canvas/Windows/SettingsViews/Pages/RandomDrawPage.xaml.cs b/Ink Canvas/Windows/SettingsViews/Pages/RandomDrawPage.xaml.cs index 5229cd89..b9e93862 100644 --- a/Ink Canvas/Windows/SettingsViews/Pages/RandomDrawPage.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/Pages/RandomDrawPage.xaml.cs @@ -216,8 +216,14 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages private void MLAvoidanceWeightSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { if (!_isLoaded) return; - var val = Math.Round(MLAvoidanceWeightSlider.Value, 2); - MLAvoidanceWeightSlider.Value = val; + var slider = MLAvoidanceWeightSlider; + var val = Math.Round(slider.Value, 2); + // 仅当四舍五入纠正了显示值时才回写;那次 set 会重入 ValueChanged 完成保存。 + if (slider.Value != val) + { + slider.Value = val; + return; + } SettingsManager.Settings.RandSettings.MLAvoidanceWeight = val; SettingsManager.SaveSettingsToFile(); } @@ -281,8 +287,13 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages private void TimerVolumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { if (!_isLoaded) return; - var val = Math.Round(TimerVolumeSlider.Value, 2); - TimerVolumeSlider.Value = val; + var slider = TimerVolumeSlider; + var val = Math.Round(slider.Value, 2); + if (slider.Value != val) + { + slider.Value = val; + return; + } SettingsManager.Settings.RandSettings.TimerVolume = val; SettingsManager.SaveSettingsToFile(); } @@ -321,8 +332,13 @@ namespace Ink_Canvas.Windows.SettingsViews.Pages private void ProgressiveReminderVolumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { if (!_isLoaded) return; - var val = Math.Round(ProgressiveReminderVolumeSlider.Value, 2); - ProgressiveReminderVolumeSlider.Value = val; + var slider = ProgressiveReminderVolumeSlider; + var val = Math.Round(slider.Value, 2); + if (slider.Value != val) + { + slider.Value = val; + return; + } SettingsManager.Settings.RandSettings.ProgressiveReminderVolume = val; SettingsManager.SaveSettingsToFile(); } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml index 9444c0ad..9ba11761 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml @@ -155,9 +155,9 @@ + ToolTipService.ToolTip="{i18n:I18n Key=Settings_Nav_Security_Tooltip}"> @@ -195,9 +195,9 @@ + ToolTipService.ToolTip="{i18n:I18n Key=Settings_Nav_Hotkey_Tooltip}"> diff --git a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs index 93e9b628..828cfce0 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs @@ -587,10 +587,9 @@ namespace Ink_Canvas.Windows.SettingsViews if (string.IsNullOrWhiteSpace(raw)) return; string query = raw.Trim(); - string queryLower = query.ToLower(); var entry = _searchIndex.FirstOrDefault(e => e.Text.Equals(query, StringComparison.OrdinalIgnoreCase)) - ?? _searchIndex.FirstOrDefault(e => e.Text.ToLower().Contains(queryLower)); + ?? _searchIndex.FirstOrDefault(e => e.Text.IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0); NavigateToSearchEntry(entry); } @@ -608,9 +607,8 @@ namespace Ink_Canvas.Windows.SettingsViews return; } - string queryLower = query.ToLower(); var suggestions = _searchIndex - .Where(e => e.Text.ToLower().Contains(queryLower)) + .Where(e => e.Text.IndexOf(query, StringComparison.OrdinalIgnoreCase) >= 0) .Select(e => e.Text) .Distinct() .Take(50)