diff --git a/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs b/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs index e09ebac4..58458cd0 100644 --- a/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs +++ b/Ink Canvas/MainWindow_cs/MW_AutoTheme.cs @@ -14,19 +14,18 @@ namespace Ink_Canvas { public partial class MainWindow : Window { - /// - /// 浮动栏前景色,根据当前主题动态更新。 - /// + private const string ThemeLight = "Light"; + private const string ThemeDark = "Dark"; + private const string LightThemePath = "Resources/Styles/Light.xaml"; + private const string DarkThemePath = "Resources/Styles/Dark.xaml"; + private const string DrawShapeImagePath = "Resources/DrawShapeImageDictionary.xaml"; + private const string SeewoImagePath = "Resources/SeewoImageDictionary.xaml"; + private const string IconImagePath = "Resources/IconImageDictionary.xaml"; + private Color FloatBarForegroundColor; - /// - /// 应用并切换到指定的主题("Light" 或 "Dark"),更新主题资源并刷新相关 UI 元素以反映主题变化。 - /// - /// 主题标识,支持 "Light" 或 "Dark"(区分大小写)。 - /// 若为 true,则根据主题自动切换并保存浮动工具栏的图标设置。 private void SetTheme(string theme, bool autoSwitchIcon = false) { - // 清理现有的主题资源 var resourcesToRemove = new List(); foreach (var dict in Application.Current.Resources.MergedDictionaries) { @@ -43,195 +42,85 @@ namespace Ink_Canvas Application.Current.Resources.MergedDictionaries.Remove(dict); } - if (theme == "Light") + var isLightTheme = theme == ThemeLight; + var themePath = isLightTheme ? LightThemePath : DarkThemePath; + var elementTheme = isLightTheme ? ElementTheme.Light : ElementTheme.Dark; + + var rd1 = new ResourceDictionary { Source = new Uri(themePath, UriKind.Relative) }; + Application.Current.Resources.MergedDictionaries.Add(rd1); + + _ = Task.Run(async () => { - // 先加载主题 - var rd1 = new ResourceDictionary + await Task.Delay(100); + Dispatcher.Invoke(() => { - Source = new Uri("Resources/Styles/Light.xaml", UriKind.Relative) - }; - Application.Current.Resources.MergedDictionaries.Add(rd1); - - // 异步加载图形资源,避免阻塞启动 - _ = Task.Run(async () => - { - await Task.Delay(100); - Dispatcher.Invoke(() => - { - var rd2 = new ResourceDictionary - { - Source = new Uri("Resources/DrawShapeImageDictionary.xaml", UriKind.Relative) - }; - Application.Current.Resources.MergedDictionaries.Add(rd2); - - var rd3 = new ResourceDictionary - { - Source = new Uri("Resources/SeewoImageDictionary.xaml", UriKind.Relative) - }; - Application.Current.Resources.MergedDictionaries.Add(rd3); - - var rd4 = new ResourceDictionary - { - Source = new Uri("Resources/IconImageDictionary.xaml", UriKind.Relative) - }; - Application.Current.Resources.MergedDictionaries.Add(rd4); - }); + LoadImageResourceDictionary(DrawShapeImagePath); + LoadImageResourceDictionary(SeewoImagePath); + LoadImageResourceDictionary(IconImagePath); }); + }); - ThemeManager.SetRequestedTheme(window, ElementTheme.Light); + ThemeManager.SetRequestedTheme(window, elementTheme); - InitializeFloatBarForegroundColor(); + InitializeFloatBarForegroundColor(); + RefreshQuickPanelIcons(); + RefreshStrokeSelectionIcons(); + RefreshImageSelectionIcons(); + RefreshGestureButtonIcon(); + RefreshFloatingBarHighlightColors(); - // 刷新快速面板图标 - RefreshQuickPanelIcons(); - - // 刷新墨迹选中栏图标 - RefreshStrokeSelectionIcons(); - - // 刷新图片选中栏图标 - RefreshImageSelectionIcons(); - - // 刷新手势按钮图标 - RefreshGestureButtonIcon(); - - RefreshFloatingBarHighlightColors(); - - if (autoSwitchIcon) - { - AutoSwitchFloatingBarIconForTheme("Light"); - } - - // 强制刷新UI - window.InvalidateVisual(); - - // 通知其他窗口刷新主题 - RefreshOtherWindowsTheme(); - } - else if (theme == "Dark") + if (autoSwitchIcon) { - // 先加载主题 - var rd1 = new ResourceDictionary { Source = new Uri("Resources/Styles/Dark.xaml", UriKind.Relative) }; - Application.Current.Resources.MergedDictionaries.Add(rd1); - - // 异步加载图形资源,避免阻塞启动 - _ = Task.Run(async () => - { - await Task.Delay(100); - Dispatcher.Invoke(() => - { - var rd2 = new ResourceDictionary - { - Source = new Uri("Resources/DrawShapeImageDictionary.xaml", UriKind.Relative) - }; - Application.Current.Resources.MergedDictionaries.Add(rd2); - - var rd3 = new ResourceDictionary - { - Source = new Uri("Resources/SeewoImageDictionary.xaml", UriKind.Relative) - }; - Application.Current.Resources.MergedDictionaries.Add(rd3); - - var rd4 = new ResourceDictionary - { - Source = new Uri("Resources/IconImageDictionary.xaml", UriKind.Relative) - }; - Application.Current.Resources.MergedDictionaries.Add(rd4); - }); - }); - - ThemeManager.SetRequestedTheme(window, ElementTheme.Dark); - - InitializeFloatBarForegroundColor(); - - // 刷新快速面板图标 - RefreshQuickPanelIcons(); - - // 刷新墨迹选中栏图标 - RefreshStrokeSelectionIcons(); - - // 刷新图片选中栏图标 - RefreshImageSelectionIcons(); - - // 刷新手势按钮图标 - RefreshGestureButtonIcon(); - - RefreshFloatingBarHighlightColors(); - - if (autoSwitchIcon) - { - AutoSwitchFloatingBarIconForTheme("Dark"); - } - - // 强制刷新UI - window.InvalidateVisual(); - - // 通知其他窗口刷新主题 - RefreshOtherWindowsTheme(); + AutoSwitchFloatingBarIconForTheme(theme); } + + window.InvalidateVisual(); + RefreshOtherWindowsTheme(); + } + + void LoadImageResourceDictionary(string path) + { + var rd = new ResourceDictionary { Source = new Uri(path, UriKind.Relative) }; + Application.Current.Resources.MergedDictionaries.Add(rd); } - /// - /// 初始化FloatBarForegroundColor,从当前主题资源中加载颜色 - /// private void InitializeFloatBarForegroundColor() { try { FloatBarForegroundColor = (Color)Application.Current.FindResource("FloatBarForegroundColor"); - - // 强制刷新浮动工具栏按钮颜色 RefreshFloatingBarButtonColors(); } catch (Exception) { - // 如果无法从资源中加载,使用默认颜色 FloatBarForegroundColor = Color.FromRgb(0, 0, 0); } } - /// - /// 刷新快速面板图标 - /// private void RefreshQuickPanelIcons() { try { - if (LeftUnFoldButtonQuickPanel != null) - { - LeftUnFoldButtonQuickPanel.InvalidateVisual(); - } - if (RightUnFoldButtonQuickPanel != null) - { - RightUnFoldButtonQuickPanel.InvalidateVisual(); - } - if (LeftSidePanel != null) - { - LeftSidePanel.InvalidateVisual(); - } - if (RightSidePanel != null) - { - RightSidePanel.InvalidateVisual(); - } + LeftUnFoldButtonQuickPanel?.InvalidateVisual(); + RightUnFoldButtonQuickPanel?.InvalidateVisual(); + LeftSidePanel?.InvalidateVisual(); + RightSidePanel?.InvalidateVisual(); } catch (Exception) { } } - /// - /// 刷新浮动栏高光条颜色 - /// private void RefreshFloatingBarHighlightColors() { try { if (FloatingbarSelectionBG != null && FloatingbarSelectionBG.Visibility == Visibility.Visible) { - // 根据主题设置高光颜色 + bool isDarkTheme = IsCurrentThemeDark(); + Color highlightBackgroundColor; Color highlightBarColor; - bool isDarkTheme = Settings.Appearance.Theme == 1 || - (Settings.Appearance.Theme == 2 && !IsSystemThemeLight()); if (isDarkTheme) { @@ -244,7 +133,6 @@ namespace Ink_Canvas highlightBarColor = Color.FromRgb(37, 99, 235); } - // 设置高光背景颜色 FloatingbarSelectionBG.Background = new SolidColorBrush(highlightBackgroundColor); if (FloatingbarSelectionBG.Child is System.Windows.Controls.Canvas canvas && canvas.Children.Count > 0) { @@ -261,74 +149,50 @@ namespace Ink_Canvas } } - /// - /// 刷新浮动工具栏按钮颜色 - /// + private bool IsCurrentThemeDark() + { + return Settings.Appearance.Theme == 1 || + (Settings.Appearance.Theme == 2 && !IsSystemThemeLight()); + } + private void RefreshFloatingBarButtonColors() { try { - // 根据主题选择高光颜色 - Color selectedColor; - bool isDarkTheme = Settings.Appearance.Theme == 1 || - (Settings.Appearance.Theme == 2 && !IsSystemThemeLight()); + SymbolIconDelete.Icon.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.DeleteIcon); + ShapeDrawFloatingBarBtn.Icon.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.ShapesIcon); + SymbolIconUndo.Icon.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.UndoIcon); + SymbolIconRedo.Icon.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.RedoIcon); + CursorWithDelFloatingBarBtn.Icon.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.CursorWithDelFloatingBarBtnIcon); + WhiteboardFloatingBarBtn.Icon.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.WhiteboardFloatingBarBtnIcon); + ToolsFloatingBarBtn.Icon.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.ToolsFloatingBarBtnIcon); + Fold_Icon.Icon.Geometry = Geometry.Parse(XamlGraphicsIconGeometries.FoldIcon); - if (isDarkTheme) - { - selectedColor = Color.FromRgb(102, 204, 255); - } - else - { - selectedColor = Color.FromRgb(30, 58, 138); - } + bool isDarkTheme = IsCurrentThemeDark(); + Color selectedColor = isDarkTheme ? Color.FromRgb(102, 204, 255) : Color.FromRgb(30, 58, 138); + + SetAllFloatingBarButtonsToColor(FloatBarForegroundColor); + + SymbolIconDelete.Icon.Brush = new SolidColorBrush(Color.FromRgb(239, 68, 68)); - // 根据当前模式设置按钮颜色 switch (_currentToolMode) { case "cursor": Cursor_Icon.Icon.Brush = new SolidColorBrush(selectedColor); - Pen_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - EraserByStrokes_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - Eraser_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - SymbolIconSelect.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); break; case "pen": case "color": - Cursor_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); Pen_Icon.Icon.Brush = new SolidColorBrush(selectedColor); - EraserByStrokes_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - Eraser_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - SymbolIconSelect.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); break; case "eraser": - Cursor_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - Pen_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - EraserByStrokes_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); Eraser_Icon.Icon.Brush = new SolidColorBrush(selectedColor); - SymbolIconSelect.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); break; case "eraserByStrokes": - Cursor_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - Pen_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); EraserByStrokes_Icon.Icon.Brush = new SolidColorBrush(selectedColor); - Eraser_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - SymbolIconSelect.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); break; case "select": - Cursor_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - Pen_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - EraserByStrokes_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - Eraser_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); SymbolIconSelect.Icon.Brush = new SolidColorBrush(selectedColor); break; - default: - // 默认情况,所有按钮都使用主题颜色 - Cursor_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - Pen_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - EraserByStrokes_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - Eraser_Icon.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - SymbolIconSelect.Icon.Brush = new SolidColorBrush(FloatBarForegroundColor); - break; } } catch (Exception) @@ -336,79 +200,60 @@ namespace Ink_Canvas } } - /// - /// 处理系统主题偏好变化事件,根据当前设置更新应用主题。 - /// - /// 事件发送者。 - /// 用户偏好变化事件参数。 - /// - /// 操作包括: - /// 1. 根据当前主题设置(Settings.Appearance.Theme)决定使用哪种主题 - /// 2. 如果设置为0(浅色主题),则设置为Light主题 - /// 3. 如果设置为1(深色主题),则设置为Dark主题 - /// 4. 如果设置为2(跟随系统主题),则根据系统主题设置应用相应的主题 - /// + void SetAllFloatingBarButtonsToColor(Color color) + { + var brush = new SolidColorBrush(color); + Cursor_Icon.Icon.Brush = brush; + Pen_Icon.Icon.Brush = brush; + EraserByStrokes_Icon.Icon.Brush = brush; + Eraser_Icon.Icon.Brush = brush; + SymbolIconSelect.Icon.Brush = brush; + ShapeDrawFloatingBarBtn.Icon.Brush = brush; + SymbolIconUndo.Icon.Brush = brush; + SymbolIconRedo.Icon.Brush = brush; + CursorWithDelFloatingBarBtn.Icon.Brush = brush; + WhiteboardFloatingBarBtn.Icon.Brush = brush; + ToolsFloatingBarBtn.Icon.Brush = brush; + Fold_Icon.Icon.Brush = brush; + } + private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) { switch (Settings.Appearance.Theme) { case 0: - SetTheme("Light"); + SetTheme(ThemeLight); break; case 1: - SetTheme("Dark"); + SetTheme(ThemeDark); break; case 2: - if (IsSystemThemeLight()) SetTheme("Light"); - else SetTheme("Dark"); + SetTheme(IsSystemThemeLight() ? ThemeLight : ThemeDark); break; } } - /// - /// 检查系统主题是否为浅色主题。 - /// - /// 系统主题为浅色返回true,深色返回false。 - /// - /// 操作包括: - /// 1. 从注册表中读取系统主题设置 - /// 2. 检查"SystemUsesLightTheme"键的值 - /// 3. 如果值为1,则表示系统使用浅色主题 - /// 4. 捕获可能的异常,确保方法不会因异常而崩溃 - /// private bool IsSystemThemeLight() { - var light = false; try { var registryKey = Registry.CurrentUser; - var themeKey = - registryKey.OpenSubKey("software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"); - var keyValue = 0; - if (themeKey != null) keyValue = (int)themeKey.GetValue("SystemUsesLightTheme"); - if (keyValue == 1) light = true; + var themeKey = registryKey.OpenSubKey("software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"); + if (themeKey != null) + { + int keyValue = (int)themeKey.GetValue("SystemUsesLightTheme"); + return keyValue == 1; + } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } - - return light; + return false; } - /// - /// 根据主题自动切换浮动栏图标 - /// private void AutoSwitchFloatingBarIconForTheme(string theme) { try { - if (theme == "Light") - { - Settings.Appearance.FloatingBarImg = 0; - } - else if (theme == "Dark") - { - Settings.Appearance.FloatingBarImg = 3; - } - + Settings.Appearance.FloatingBarImg = theme == ThemeLight ? 0 : 3; UpdateFloatingBarIcon(); UpdateFloatingBarIconComboBox(); } @@ -417,9 +262,6 @@ namespace Ink_Canvas } } - /// - /// 更新设置界面中的浮动栏图标选择下拉框显示 - /// private void UpdateFloatingBarIconComboBox() { try @@ -434,94 +276,45 @@ namespace Ink_Canvas } } - /// - /// 刷新墨迹选中栏图标 - /// private void RefreshStrokeSelectionIcons() { try { if (BorderStrokeSelectionControl != null) { - // 强制刷新墨迹选中栏的视觉状态 BorderStrokeSelectionControl.InvalidateVisual(); - - // 刷新墨迹选中栏内的所有图标 var viewbox = BorderStrokeSelectionControl.Child as Viewbox; if (viewbox?.Child is ui.SimpleStackPanel stackPanel) { - RefreshStrokeSelectionIconsRecursive(stackPanel); + RefreshIconsRecursive(stackPanel); } } } catch (Exception) { - // 忽略异常,确保主题切换不会因为图标刷新失败而中断 } } - /// - /// 递归刷新墨迹选中栏内的图标 - /// - private void RefreshStrokeSelectionIconsRecursive(System.Windows.Controls.Panel panel) - { - try - { - foreach (var child in panel.Children) - { - if (child is Image image) - { - // 强制刷新图像 - image.InvalidateVisual(); - } - else if (child is System.Windows.Controls.Panel childPanel) - { - // 递归处理子面板 - RefreshStrokeSelectionIconsRecursive(childPanel); - } - else if (child is Border border && border.Child is System.Windows.Controls.Panel borderPanel) - { - // 处理Border内的面板 - RefreshStrokeSelectionIconsRecursive(borderPanel); - } - } - } - catch (Exception) - { - // 忽略异常 - } - } - - /// - /// 刷新图片选中栏图标 - /// private void RefreshImageSelectionIcons() { try { if (BorderImageSelectionControl != null) { - // 强制刷新图片选中栏的视觉状态 BorderImageSelectionControl.InvalidateVisual(); - - // 刷新图片选中栏内的所有图标 var viewbox = BorderImageSelectionControl.Child as Viewbox; if (viewbox?.Child is ui.SimpleStackPanel stackPanel) { - RefreshImageSelectionIconsRecursive(stackPanel); + RefreshIconsRecursive(stackPanel); } } } catch (Exception) { - // 忽略异常,确保主题切换不会因为图标刷新失败而中断 } } - /// - /// 递归刷新图片选中栏内的图标 - /// - private void RefreshImageSelectionIconsRecursive(System.Windows.Controls.Panel panel) + private void RefreshIconsRecursive(System.Windows.Controls.Panel panel) { try { @@ -529,22 +322,18 @@ namespace Ink_Canvas { if (child is Image image) { - // 强制刷新图像 image.InvalidateVisual(); } else if (child is System.Windows.Controls.Panel childPanel) { - // 递归处理子面板 - RefreshImageSelectionIconsRecursive(childPanel); + RefreshIconsRecursive(childPanel); } else if (child is Border border && border.Child is System.Windows.Controls.Panel borderPanel) { - // 处理Border内的面板 - RefreshImageSelectionIconsRecursive(borderPanel); + RefreshIconsRecursive(borderPanel); } else if (child is Grid grid) { - // 处理Grid内的子元素 foreach (var gridChild in grid.Children) { if (gridChild is Image gridImage) @@ -557,18 +346,13 @@ namespace Ink_Canvas } catch (Exception) { - // 忽略异常 } } - /// - /// 刷新手势按钮图标 - /// private void RefreshGestureButtonIcon() { try { - // 调用手势按钮颜色和图标更新方法,该方法会根据当前主题和手势状态设置正确的图标 CheckEnableTwoFingerGestureBtnColorPrompt(); } catch (Exception) @@ -576,14 +360,10 @@ namespace Ink_Canvas } } - /// - /// 刷新其他窗口的主题 - /// private void RefreshOtherWindowsTheme() { try { - // 刷新所有打开的窗口 foreach (Window window in Application.Current.Windows) { if (window is CountdownTimerWindow timerWindow) @@ -600,20 +380,12 @@ namespace Ink_Canvas } } - // 刷新计时器控件 - if (TimerControl != null) - { - TimerControl.RefreshTheme(); - } - - if (MinimizedTimerControl != null) - { - MinimizedTimerControl.RefreshTheme(); - } + TimerControl?.RefreshTheme(); + MinimizedTimerControl?.RefreshTheme(); } catch (Exception) { } } } -} \ No newline at end of file +}