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)