diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml b/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml index f5a51a09..0f7d72cf 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml @@ -77,7 +77,7 @@ - + @@ -88,7 +88,7 @@ - + diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml.cs index cd0757df..54b62150 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/AdvancedPanel.xaml.cs @@ -169,7 +169,7 @@ namespace Ink_Canvas.Windows.SettingsViews if (toggleSwitch == null) return; toggleSwitch.Background = isOn ? new SolidColorBrush(Color.FromRgb(53, 132, 228)) - : new SolidColorBrush(Color.FromRgb(225, 225, 225)); + : ThemeHelper.GetButtonBackgroundBrush(); var innerBorder = toggleSwitch.Child as Border; if (innerBorder != null) { diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/AppearancePanel.xaml b/Ink Canvas/Windows/SettingsViews/SettingsViews/AppearancePanel.xaml index fef55676..4c7692e2 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/AppearancePanel.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/AppearancePanel.xaml @@ -161,7 +161,7 @@ - + @@ -172,7 +172,7 @@ - + @@ -183,7 +183,7 @@ - + diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/AppearancePanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/AppearancePanel.xaml.cs index 9e331498..6d5dc5d9 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/AppearancePanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/AppearancePanel.xaml.cs @@ -9,9 +9,75 @@ namespace Ink_Canvas.Windows.SettingsViews /// public partial class AppearancePanel : UserControl { + private bool _isLoaded = false; + public AppearancePanel() { InitializeComponent(); + Loaded += AppearancePanel_Loaded; + } + + private void AppearancePanel_Loaded(object sender, RoutedEventArgs e) + { + LoadSettings(); + // 添加触摸支持 + MainWindowSettingsHelper.EnableTouchSupportForControls(this); + // 应用主题 + ApplyTheme(); + _isLoaded = true; + } + + /// + /// 加载设置 + /// + public void LoadSettings() + { + if (MainWindow.Settings == null || MainWindow.Settings.Appearance == null) return; + + _isLoaded = false; + + try + { + var appearance = MainWindow.Settings.Appearance; + + // 浮动工具栏缩放 + if (ViewboxFloatingBarScaleTransformValueSlider != null) + { + double val = appearance.ViewboxFloatingBarScaleTransformValue; + if (val == 0) val = 1.0; + ViewboxFloatingBarScaleTransformValueSlider.Value = val; + if (ViewboxFloatingBarScaleTransformValueText != null) + { + ViewboxFloatingBarScaleTransformValueText.Text = val.ToString("F2"); + } + } + + // 浮动工具栏透明度 + if (ViewboxFloatingBarOpacityValueSlider != null) + { + ViewboxFloatingBarOpacityValueSlider.Value = appearance.ViewboxFloatingBarOpacityValue; + if (ViewboxFloatingBarOpacityValueText != null) + { + ViewboxFloatingBarOpacityValueText.Text = appearance.ViewboxFloatingBarOpacityValue.ToString("F2"); + } + } + + // 浮栏在PPT下透明度 + if (ViewboxFloatingBarOpacityInPPTValueSlider != null) + { + ViewboxFloatingBarOpacityInPPTValueSlider.Value = appearance.ViewboxFloatingBarOpacityInPPTValue; + if (ViewboxFloatingBarOpacityInPPTValueText != null) + { + ViewboxFloatingBarOpacityInPPTValueText.Text = appearance.ViewboxFloatingBarOpacityInPPTValue.ToString("F2"); + } + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"加载外观设置时出错: {ex.Message}"); + } + + _isLoaded = true; } public event EventHandler IsTopBarNeedShadowEffect; @@ -44,5 +110,41 @@ namespace Ink_Canvas.Windows.SettingsViews System.Diagnostics.Debug.WriteLine($"AppearancePanel 应用主题时出错: {ex.Message}"); } } + + /// + /// Slider值变化事件处理 + /// + private void ViewboxFloatingBarScaleTransformValueSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (!_isLoaded) return; + if (ViewboxFloatingBarScaleTransformValueSlider != null && ViewboxFloatingBarScaleTransformValueText != null) + { + double val = ViewboxFloatingBarScaleTransformValueSlider.Value; + ViewboxFloatingBarScaleTransformValueText.Text = val.ToString("F2"); + MainWindowSettingsHelper.InvokeSliderValueChanged("ViewboxFloatingBarScaleTransformValueSlider", val); + } + } + + private void ViewboxFloatingBarOpacityValueSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (!_isLoaded) return; + if (ViewboxFloatingBarOpacityValueSlider != null && ViewboxFloatingBarOpacityValueText != null) + { + double val = ViewboxFloatingBarOpacityValueSlider.Value; + ViewboxFloatingBarOpacityValueText.Text = val.ToString("F2"); + MainWindowSettingsHelper.InvokeSliderValueChanged("ViewboxFloatingBarOpacityValueSlider", val); + } + } + + private void ViewboxFloatingBarOpacityInPPTValueSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (!_isLoaded) return; + if (ViewboxFloatingBarOpacityInPPTValueSlider != null && ViewboxFloatingBarOpacityInPPTValueText != null) + { + double val = ViewboxFloatingBarOpacityInPPTValueSlider.Value; + ViewboxFloatingBarOpacityInPPTValueText.Text = val.ToString("F2"); + MainWindowSettingsHelper.InvokeSliderValueChanged("ViewboxFloatingBarOpacityInPPTValueSlider", val); + } + } } } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/AutomationPanel.xaml b/Ink Canvas/Windows/SettingsViews/SettingsViews/AutomationPanel.xaml index d5999941..37306bed 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/AutomationPanel.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/AutomationPanel.xaml @@ -288,8 +288,8 @@ - - + + @@ -304,8 +304,8 @@ - - + + @@ -318,8 +318,8 @@ - - + + @@ -332,8 +332,8 @@ - - + + @@ -346,8 +346,8 @@ - - + + @@ -360,8 +360,8 @@ - - + + @@ -377,8 +377,8 @@ - - + + @@ -391,8 +391,8 @@ - - + + @@ -405,8 +405,8 @@ - - + + diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/AutomationPanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/AutomationPanel.xaml.cs index 775be208..d074631b 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/AutomationPanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/AutomationPanel.xaml.cs @@ -1,7 +1,10 @@ +using Ink_Canvas; +using iNKORE.UI.WPF.Helpers; using System; using System.Windows; using System.Windows.Controls; -using Ink_Canvas.Windows.SettingsViews; +using System.Windows.Media; +using Application = System.Windows.Application; namespace Ink_Canvas.Windows.SettingsViews { @@ -31,69 +34,80 @@ namespace Ink_Canvas.Windows.SettingsViews /// /// 加载设置 /// - private void LoadSettings() + public void LoadSettings() { + if (MainWindow.Settings == null || MainWindow.Settings.Automation == null) + { + _isLoaded = true; + return; + } + + _isLoaded = false; + try { - if (MainWindow.Settings == null || MainWindow.Settings.Automation == null) return; - - _isLoaded = false; - var automation = MainWindow.Settings.Automation; // 设置所有 ToggleSwitch 的状态 - SetToggleSwitchState("ToggleSwitchAutoFoldInEasiNote", automation.IsAutoFoldInEasiNote); - SetToggleSwitchState("ToggleSwitchAutoFoldInEasiCamera", automation.IsAutoFoldInEasiCamera); - SetToggleSwitchState("ToggleSwitchAutoFoldInHiteTouchPro", automation.IsAutoFoldInHiteTouchPro); - SetToggleSwitchState("ToggleSwitchAutoFoldInEasiNote3", automation.IsAutoFoldInEasiNote3); - SetToggleSwitchState("ToggleSwitchAutoFoldInEasiNote3C", automation.IsAutoFoldInEasiNote3C); - SetToggleSwitchState("ToggleSwitchAutoFoldInEasiNote5C", automation.IsAutoFoldInEasiNote5C); - SetToggleSwitchState("ToggleSwitchAutoFoldInSeewoPincoTeacher", automation.IsAutoFoldInSeewoPincoTeacher); - SetToggleSwitchState("ToggleSwitchAutoFoldInHiteCamera", automation.IsAutoFoldInHiteCamera); - SetToggleSwitchState("ToggleSwitchAutoFoldInHiteLightBoard", automation.IsAutoFoldInHiteLightBoard); - SetToggleSwitchState("ToggleSwitchAutoFoldInWxBoardMain", automation.IsAutoFoldInWxBoardMain); - SetToggleSwitchState("ToggleSwitchAutoFoldInMSWhiteboard", automation.IsAutoFoldInMSWhiteboard); - SetToggleSwitchState("ToggleSwitchAutoFoldInAdmoxWhiteboard", automation.IsAutoFoldInAdmoxWhiteboard); - SetToggleSwitchState("ToggleSwitchAutoFoldInAdmoxBooth", automation.IsAutoFoldInAdmoxBooth); - SetToggleSwitchState("ToggleSwitchAutoFoldInQPoint", automation.IsAutoFoldInQPoint); - SetToggleSwitchState("ToggleSwitchAutoFoldInYiYunVisualPresenter", automation.IsAutoFoldInYiYunVisualPresenter); - SetToggleSwitchState("ToggleSwitchAutoFoldInMaxHubWhiteboard", automation.IsAutoFoldInMaxHubWhiteboard); - SetToggleSwitchState("ToggleSwitchAutoFoldInPPTSlideShow", automation.IsAutoFoldInPPTSlideShow); - SetToggleSwitchState("ToggleSwitchAutoFoldInEasiNoteIgnoreDesktopAnno", automation.IsAutoFoldInEasiNoteIgnoreDesktopAnno); - SetToggleSwitchState("ToggleSwitchAutoFoldInOldZyBoard", automation.IsAutoFoldInOldZyBoard); - SetToggleSwitchState("ToggleSwitchKeepFoldAfterSoftwareExit", automation.KeepFoldAfterSoftwareExit); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInEasiNote"), automation.IsAutoFoldInEasiNote); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInEasiCamera"), automation.IsAutoFoldInEasiCamera); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInHiteTouchPro"), automation.IsAutoFoldInHiteTouchPro); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInEasiNote3"), automation.IsAutoFoldInEasiNote3); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInEasiNote3C"), automation.IsAutoFoldInEasiNote3C); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInEasiNote5C"), automation.IsAutoFoldInEasiNote5C); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInSeewoPincoTeacher"), automation.IsAutoFoldInSeewoPincoTeacher); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInHiteCamera"), automation.IsAutoFoldInHiteCamera); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInHiteLightBoard"), automation.IsAutoFoldInHiteLightBoard); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInWxBoardMain"), automation.IsAutoFoldInWxBoardMain); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInMSWhiteboard"), automation.IsAutoFoldInMSWhiteboard); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInAdmoxWhiteboard"), automation.IsAutoFoldInAdmoxWhiteboard); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInAdmoxBooth"), automation.IsAutoFoldInAdmoxBooth); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInQPoint"), automation.IsAutoFoldInQPoint); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInYiYunVisualPresenter"), automation.IsAutoFoldInYiYunVisualPresenter); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInMaxHubWhiteboard"), automation.IsAutoFoldInMaxHubWhiteboard); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInPPTSlideShow"), automation.IsAutoFoldInPPTSlideShow); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInEasiNoteIgnoreDesktopAnno"), automation.IsAutoFoldInEasiNoteIgnoreDesktopAnno); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoFoldInOldZyBoard"), automation.IsAutoFoldInOldZyBoard); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchKeepFoldAfterSoftwareExit"), automation.KeepFoldAfterSoftwareExit); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoKillPptService"), automation.IsAutoKillPptService); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoKillEasiNote"), automation.IsAutoKillEasiNote); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoKillHiteAnnotation"), automation.IsAutoKillHiteAnnotation); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoEnterAnnotationAfterKillHite"), automation.IsAutoEnterAnnotationAfterKillHite); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoKillVComYouJiao"), automation.IsAutoKillVComYouJiao); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoKillSeewoLauncher2DesktopAnnotation"), automation.IsAutoKillSeewoLauncher2DesktopAnnotation); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoKillInkCanvas"), automation.IsAutoKillInkCanvas); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoKillICA"), automation.IsAutoKillICA); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoKillIDT"), automation.IsAutoKillIDT); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"AutomationPanel 加载设置时出错: {ex.Message}"); } + + _isLoaded = true; + } + + /// + /// 查找ToggleSwitch控件 + /// + private Border FindToggleSwitch(string name) + { + return this.FindDescendantByName(name) as Border; } /// /// 设置 ToggleSwitch 状态 /// - private void SetToggleSwitchState(string name, bool isOn) + private void SetToggleSwitchState(Border toggleSwitch, bool isOn) { - try + if (toggleSwitch == null) return; + toggleSwitch.Background = isOn + ? new SolidColorBrush(Color.FromRgb(53, 132, 228)) + : ThemeHelper.GetButtonBackgroundBrush(); + var innerBorder = toggleSwitch.Child as Border; + if (innerBorder != null) { - var border = FindName(name) as System.Windows.Controls.Border; - if (border != null) - { - bool currentState = border.Background.ToString().Contains("3584e4"); - if (currentState != isOn) - { - border.Background = isOn ? new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(0x35, 0x84, 0xe4)) : new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(0xe1, 0xe1, 0xe1)); - var innerBorder = border.Child as System.Windows.Controls.Border; - if (innerBorder != null) - { - innerBorder.HorizontalAlignment = isOn ? HorizontalAlignment.Right : HorizontalAlignment.Left; - } - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"AutomationPanel 设置 ToggleSwitch {name} 状态时出错: {ex.Message}"); + innerBorder.HorizontalAlignment = isOn ? HorizontalAlignment.Right : HorizontalAlignment.Left; } } @@ -104,12 +118,15 @@ namespace Ink_Canvas.Windows.SettingsViews { if (!_isLoaded) return; - var border = sender as System.Windows.Controls.Border; + // 标记事件已处理,防止事件冒泡 + e.Handled = true; + + var border = sender as Border; if (border == null) return; - bool currentState = border.Background.ToString().Contains("3584e4"); - bool newState = !currentState; - SetToggleSwitchState(border.Name, newState); + bool isOn = border.Background.ToString() == "#FF3584E4"; + bool newState = !isOn; + SetToggleSwitchState(border, newState); // 通过 MainWindowSettingsHelper 调用 MainWindow 中的方法 string toggleSwitchName = border.Name; diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/CanvasAndInkPanel.xaml b/Ink Canvas/Windows/SettingsViews/SettingsViews/CanvasAndInkPanel.xaml index 5201d4e1..d7cf0aa8 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/CanvasAndInkPanel.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/CanvasAndInkPanel.xaml @@ -177,78 +177,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/CanvasAndInkPanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/CanvasAndInkPanel.xaml.cs index 63db2229..123271a8 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/CanvasAndInkPanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/CanvasAndInkPanel.xaml.cs @@ -108,15 +108,6 @@ namespace Ink_Canvas.Windows.SettingsViews // 保留双曲线渐近线 SetOptionButtonState("HyperbolaAsymptote", (int)canvas.HyperbolaAsymptoteOption); - // 绘制圆时显示圆心位置 - SetToggleSwitchState(FindToggleSwitch("ToggleSwitchShowCircleCenter"), canvas.ShowCircleCenter); - - // 使用WPF默认贝塞尔曲线平滑 - SetToggleSwitchState(FindToggleSwitch("ToggleSwitchFitToCurve"), canvas.FitToCurve && !canvas.UseAdvancedBezierSmoothing); - - // 使用高级贝塞尔曲线平滑 - SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAdvancedBezierSmoothing"), canvas.UseAdvancedBezierSmoothing); - // 启用异步墨迹平滑 SetToggleSwitchState(FindToggleSwitch("ToggleSwitchUseAsyncInkSmoothing"), canvas.UseAsyncInkSmoothing); @@ -132,17 +123,6 @@ namespace Ink_Canvas.Windows.SettingsViews // 启用直线端点吸附 SetToggleSwitchState(FindToggleSwitch("ToggleSwitchLineEndpointSnapping"), canvas.LineEndpointSnapping); - // 启用墨迹渐隐功能 - SetToggleSwitchState(FindToggleSwitch("ToggleSwitchEnableInkFade"), canvas.EnableInkFade); - if (InkFadeTimePanel != null) - { - InkFadeTimePanel.Visibility = canvas.EnableInkFade ? Visibility.Visible : Visibility.Collapsed; - } - if (InkFadeTimeSlider != null) - { - InkFadeTimeSlider.Value = canvas.InkFadeTime; - } - // 定时自动保存墨迹 // 注意:这个设置可能在 Automation 或 Canvas 中,需要根据实际情况调整 // SetToggleSwitchState(FindToggleSwitch("ToggleSwitchEnableAutoSaveStrokes"), ...); @@ -184,7 +164,7 @@ namespace Ink_Canvas.Windows.SettingsViews if (toggleSwitch == null) return; toggleSwitch.Background = isOn ? new SolidColorBrush(Color.FromRgb(53, 132, 228)) - : new SolidColorBrush(Color.FromRgb(225, 225, 225)); + : ThemeHelper.GetButtonBackgroundBrush(); var innerBorder = toggleSwitch.Child as Border; if (innerBorder != null) { @@ -298,33 +278,6 @@ namespace Ink_Canvas.Windows.SettingsViews MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchCompressPicturesUploaded", newState); break; - case "ShowCircleCenter": - // 调用 MainWindow 中的方法 - MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchShowCircleCenter", newState); - break; - - case "FitToCurve": - // 调用 MainWindow 中的方法 - MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchFitToCurve", newState); - // 处理互斥逻辑 - if (newState) - { - MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchAdvancedBezierSmoothing", false); - SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAdvancedBezierSmoothing"), false); - } - break; - - case "AdvancedBezierSmoothing": - // 调用 MainWindow 中的方法 - MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchAdvancedBezierSmoothing", newState); - // 处理互斥逻辑 - if (newState) - { - MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchFitToCurve", false); - SetToggleSwitchState(FindToggleSwitch("ToggleSwitchFitToCurve"), false); - } - break; - case "UseAsyncInkSmoothing": // 调用 MainWindow 中的方法 MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchAsyncInkSmoothing", newState); @@ -350,16 +303,6 @@ namespace Ink_Canvas.Windows.SettingsViews MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchLineEndpointSnapping", newState); break; - case "EnableInkFade": - // 调用 MainWindow 中的方法 - MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchEnableInkFade", newState); - // 更新UI状态 - if (InkFadeTimePanel != null) - { - InkFadeTimePanel.Visibility = newState ? Visibility.Visible : Visibility.Collapsed; - } - break; - case "EnableAutoSaveStrokes": // 调用 MainWindow 中的方法 MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchEnableAutoSaveStrokes", newState); @@ -576,17 +519,6 @@ namespace Ink_Canvas.Windows.SettingsViews /// /// Slider值变化事件处理 /// - private void InkFadeTimeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) - { - if (!_isLoaded) return; - if (InkFadeTimeSlider != null && InkFadeTimeText != null) - { - double value = InkFadeTimeSlider.Value; - InkFadeTimeText.Text = $"{(int)value}ms"; - // 调用 MainWindow 中的方法 - MainWindowSettingsHelper.InvokeSliderValueChanged("InkFadeTimeSlider", value); - } - } /// /// 应用主题 diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/GesturesPanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/GesturesPanel.xaml.cs index 5e71f8c2..1cc9012d 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/GesturesPanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/GesturesPanel.xaml.cs @@ -122,7 +122,7 @@ namespace Ink_Canvas.Windows.SettingsViews if (toggleSwitch == null) return; toggleSwitch.Background = isOn ? new SolidColorBrush(Color.FromRgb(53, 132, 228)) - : new SolidColorBrush(Color.FromRgb(225, 225, 225)); + : ThemeHelper.GetButtonBackgroundBrush(); var innerBorder = toggleSwitch.Child as Border; if (innerBorder != null) { @@ -297,8 +297,8 @@ namespace Ink_Canvas.Windows.SettingsViews MainWindowSettingsHelper.UpdateSettingDirectly(() => { if (MainWindow.Settings.Canvas != null) - { - MainWindow.Settings.Canvas.PalmEraserSensitivity = sensitivity; + { + MainWindow.Settings.Canvas.PalmEraserSensitivity = sensitivity; } }, "ComboBoxPalmEraserSensitivity"); } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/InkRecognitionPanel.xaml b/Ink Canvas/Windows/SettingsViews/SettingsViews/InkRecognitionPanel.xaml index ff5a3bdf..8ebd1a84 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/InkRecognitionPanel.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/InkRecognitionPanel.xaml @@ -125,7 +125,7 @@ - + @@ -140,7 +140,7 @@ - + @@ -183,7 +183,7 @@ - + diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/InkRecognitionPanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/InkRecognitionPanel.xaml.cs index 9ec8aa82..bc573bc5 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/InkRecognitionPanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/InkRecognitionPanel.xaml.cs @@ -1,3 +1,5 @@ +using Ink_Canvas; +using iNKORE.UI.WPF.Helpers; using System; using System.Windows; using System.Windows.Controls; @@ -9,9 +11,104 @@ namespace Ink_Canvas.Windows.SettingsViews /// public partial class InkRecognitionPanel : UserControl { + private bool _isLoaded = false; + public InkRecognitionPanel() { InitializeComponent(); + Loaded += InkRecognitionPanel_Loaded; + } + + private void InkRecognitionPanel_Loaded(object sender, RoutedEventArgs e) + { + LoadSettings(); + // 添加触摸支持 + MainWindowSettingsHelper.EnableTouchSupportForControls(this); + // 应用主题 + ApplyTheme(); + _isLoaded = true; + } + + /// + /// 加载设置 + /// + public void LoadSettings() + { + if (MainWindow.Settings == null || MainWindow.Settings.Canvas == null || MainWindow.Settings.InkToShape == null) return; + + _isLoaded = false; + + try + { + var canvas = MainWindow.Settings.Canvas; + var inkToShape = MainWindow.Settings.InkToShape; + + // 自动拉直线阈值 + if (AutoStraightenLineThresholdSlider != null) + { + AutoStraightenLineThresholdSlider.Value = canvas.AutoStraightenLineThreshold; + if (AutoStraightenLineThresholdText != null) + { + AutoStraightenLineThresholdText.Text = ((int)canvas.AutoStraightenLineThreshold).ToString(); + } + } + + // 灵敏度 + if (LineStraightenSensitivitySlider != null) + { + LineStraightenSensitivitySlider.Value = inkToShape.LineStraightenSensitivity; + if (LineStraightenSensitivityText != null) + { + LineStraightenSensitivityText.Text = inkToShape.LineStraightenSensitivity.ToString("F2"); + } + } + + // 高精度直线拉直 + var toggleSwitchHighPrecisionLineStraighten = this.FindDescendantByName("ToggleSwitchHighPrecisionLineStraighten") as Border; + if (toggleSwitchHighPrecisionLineStraighten != null) + { + bool isOn = canvas.HighPrecisionLineStraighten; + toggleSwitchHighPrecisionLineStraighten.Background = isOn + ? new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(53, 132, 228)) + : ThemeHelper.GetButtonBackgroundBrush(); + var innerBorder = toggleSwitchHighPrecisionLineStraighten.Child as Border; + if (innerBorder != null) + { + innerBorder.HorizontalAlignment = isOn ? HorizontalAlignment.Right : HorizontalAlignment.Left; + } + } + + // 直线端点吸附 + var toggleSwitchLineEndpointSnapping = this.FindDescendantByName("ToggleSwitchLineEndpointSnapping") as Border; + if (toggleSwitchLineEndpointSnapping != null) + { + bool isOn = canvas.LineEndpointSnapping; + toggleSwitchLineEndpointSnapping.Background = isOn + ? new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(53, 132, 228)) + : ThemeHelper.GetButtonBackgroundBrush(); + var innerBorder = toggleSwitchLineEndpointSnapping.Child as Border; + if (innerBorder != null) + { + innerBorder.HorizontalAlignment = isOn ? HorizontalAlignment.Right : HorizontalAlignment.Left; + } + } + + // 吸附距离 + if (LineEndpointSnappingThresholdSlider != null) + { + LineEndpointSnappingThresholdSlider.Value = canvas.LineEndpointSnappingThreshold; + if (LineEndpointSnappingThresholdText != null) + { + LineEndpointSnappingThresholdText.Text = ((int)canvas.LineEndpointSnappingThreshold).ToString(); + } + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"加载墨迹识别设置时出错: {ex.Message}"); + } + + _isLoaded = true; } public event EventHandler IsTopBarNeedShadowEffect; @@ -44,6 +141,42 @@ namespace Ink_Canvas.Windows.SettingsViews System.Diagnostics.Debug.WriteLine($"InkRecognitionPanel 应用主题时出错: {ex.Message}"); } } + + /// + /// Slider值变化事件处理 + /// + private void AutoStraightenLineThresholdSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (!_isLoaded) return; + if (AutoStraightenLineThresholdSlider != null && AutoStraightenLineThresholdText != null) + { + double val = AutoStraightenLineThresholdSlider.Value; + AutoStraightenLineThresholdText.Text = ((int)val).ToString(); + MainWindowSettingsHelper.InvokeSliderValueChanged("AutoStraightenLineThresholdSlider", val); + } + } + + private void LineStraightenSensitivitySlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (!_isLoaded) return; + if (LineStraightenSensitivitySlider != null && LineStraightenSensitivityText != null) + { + double val = LineStraightenSensitivitySlider.Value; + LineStraightenSensitivityText.Text = val.ToString("F2"); + MainWindowSettingsHelper.InvokeSliderValueChanged("LineStraightenSensitivitySlider", val); + } + } + + private void LineEndpointSnappingThresholdSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (!_isLoaded) return; + if (LineEndpointSnappingThresholdSlider != null && LineEndpointSnappingThresholdText != null) + { + double val = LineEndpointSnappingThresholdSlider.Value; + LineEndpointSnappingThresholdText.Text = ((int)val).ToString(); + MainWindowSettingsHelper.InvokeSliderValueChanged("LineEndpointSnappingThresholdSlider", val); + } + } } } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/LuckyRandomPanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/LuckyRandomPanel.xaml.cs index 64cdb4bc..b16f7c64 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/LuckyRandomPanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/LuckyRandomPanel.xaml.cs @@ -169,7 +169,7 @@ namespace Ink_Canvas.Windows.SettingsViews if (toggleSwitch == null) return; toggleSwitch.Background = isOn ? new SolidColorBrush(Color.FromRgb(53, 132, 228)) - : new SolidColorBrush(Color.FromRgb(225, 225, 225)); + : ThemeHelper.GetButtonBackgroundBrush(); var innerBorder = toggleSwitch.Child as Border; if (innerBorder != null) { @@ -199,7 +199,8 @@ namespace Ink_Canvas.Windows.SettingsViews { if (i == selectedIndex) { - button.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225)); + // 使用主题适配的选中背景颜色 + button.Background = ThemeHelper.GetSelectedBackgroundBrush(); var textBlock = button.Child as TextBlock; if (textBlock != null) { @@ -314,8 +315,8 @@ namespace Ink_Canvas.Windows.SettingsViews } } - // 设置当前按钮为选中状态 - border.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225)); + // 设置当前按钮为选中状态,使用主题适配的选中背景颜色 + border.Background = ThemeHelper.GetSelectedBackgroundBrush(); var currentTextBlock = border.Child as TextBlock; if (currentTextBlock != null) { @@ -359,7 +360,7 @@ namespace Ink_Canvas.Windows.SettingsViews // 如果找不到控件,直接更新设置 MainWindowSettingsHelper.UpdateSettingDirectly(() => { - randSettings.ExternalCallerType = callerType; + randSettings.ExternalCallerType = callerType; }, "ComboBoxExternalCallerType"); } } @@ -369,7 +370,7 @@ namespace Ink_Canvas.Windows.SettingsViews // 背景选择逻辑 - 这个设置可能没有对应的方法,直接更新 MainWindowSettingsHelper.UpdateSettingDirectly(() => { - randSettings.SelectedBackgroundIndex = 0; // 默认背景 + randSettings.SelectedBackgroundIndex = 0; // 默认背景 }, "PickNameBackground"); break; } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/MainWindowSettingsHelper.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/MainWindowSettingsHelper.cs index a88b64f5..d050560f 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/MainWindowSettingsHelper.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/MainWindowSettingsHelper.cs @@ -73,9 +73,51 @@ namespace Ink_Canvas.Windows.SettingsViews } } } - // 即使找不到控件,也尝试触发事件(可能通过反射调用) + else + { + // 如果找不到控件和属性,先更新设置 + // 对于自动收纳相关的设置,直接更新 Settings 对象 + if (toggleSwitchName.StartsWith("ToggleSwitchAutoFold") || toggleSwitchName == "ToggleSwitchKeepFoldAfterSoftwareExit") + { + UpdateAutoFoldSetting(toggleSwitchName, isOn); + + // 对于需要调用 StartOrStoptimerCheckAutoFold 的设置 + if (toggleSwitchName.StartsWith("ToggleSwitchAutoFold") && + !toggleSwitchName.Contains("PPTSlideShow") && + !toggleSwitchName.Contains("KeepFold") && + !toggleSwitchName.Contains("IgnoreDesktopAnno")) + { + try + { + InvokeMainWindowMethod("StartOrStoptimerCheckAutoFold"); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"调用 StartOrStoptimerCheckAutoFold 失败: {ex.Message}"); + } + } + + // 通知新设置面板同步状态 + NotifySettingsPanelsSyncState(toggleSwitchName); + return; + } + } + + // 尝试触发事件(可能通过反射调用) var toggledMethodName = toggleSwitchName + "_Toggled"; - InvokeMainWindowMethod(toggledMethodName, null, new RoutedEventArgs()); + var method = mainWindow.GetType().GetMethod(toggledMethodName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + if (method != null) + { + try + { + // 尝试直接调用方法 + InvokeMainWindowMethod(toggledMethodName, null, new RoutedEventArgs()); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"调用 {toggledMethodName} 失败: {ex.Message}"); + } + } // 通知新设置面板同步状态 NotifySettingsPanelsSyncState(toggleSwitchName); @@ -106,6 +148,61 @@ namespace Ink_Canvas.Windows.SettingsViews } } + /// + /// 更新自动收纳相关的设置 + /// + private static void UpdateAutoFoldSetting(string toggleSwitchName, bool isOn) + { + try + { + if (MainWindow.Settings?.Automation == null) return; + + // 根据 ToggleSwitch 名称映射到对应的设置属性 + var settingMap = new Dictionary> + { + { "ToggleSwitchAutoFoldInEasiNote", (val) => MainWindow.Settings.Automation.IsAutoFoldInEasiNote = val }, + { "ToggleSwitchAutoFoldInEasiCamera", (val) => MainWindow.Settings.Automation.IsAutoFoldInEasiCamera = val }, + { "ToggleSwitchAutoFoldInHiteTouchPro", (val) => MainWindow.Settings.Automation.IsAutoFoldInHiteTouchPro = val }, + { "ToggleSwitchAutoFoldInEasiNote3", (val) => MainWindow.Settings.Automation.IsAutoFoldInEasiNote3 = val }, + { "ToggleSwitchAutoFoldInEasiNote3C", (val) => MainWindow.Settings.Automation.IsAutoFoldInEasiNote3C = val }, + { "ToggleSwitchAutoFoldInEasiNote5C", (val) => MainWindow.Settings.Automation.IsAutoFoldInEasiNote5C = val }, + { "ToggleSwitchAutoFoldInSeewoPincoTeacher", (val) => MainWindow.Settings.Automation.IsAutoFoldInSeewoPincoTeacher = val }, + { "ToggleSwitchAutoFoldInHiteCamera", (val) => MainWindow.Settings.Automation.IsAutoFoldInHiteCamera = val }, + { "ToggleSwitchAutoFoldInHiteLightBoard", (val) => MainWindow.Settings.Automation.IsAutoFoldInHiteLightBoard = val }, + { "ToggleSwitchAutoFoldInWxBoardMain", (val) => MainWindow.Settings.Automation.IsAutoFoldInWxBoardMain = val }, + { "ToggleSwitchAutoFoldInMSWhiteboard", (val) => MainWindow.Settings.Automation.IsAutoFoldInMSWhiteboard = val }, + { "ToggleSwitchAutoFoldInAdmoxWhiteboard", (val) => MainWindow.Settings.Automation.IsAutoFoldInAdmoxWhiteboard = val }, + { "ToggleSwitchAutoFoldInAdmoxBooth", (val) => MainWindow.Settings.Automation.IsAutoFoldInAdmoxBooth = val }, + { "ToggleSwitchAutoFoldInQPoint", (val) => MainWindow.Settings.Automation.IsAutoFoldInQPoint = val }, + { "ToggleSwitchAutoFoldInYiYunVisualPresenter", (val) => MainWindow.Settings.Automation.IsAutoFoldInYiYunVisualPresenter = val }, + { "ToggleSwitchAutoFoldInMaxHubWhiteboard", (val) => MainWindow.Settings.Automation.IsAutoFoldInMaxHubWhiteboard = val }, + { "ToggleSwitchAutoFoldInPPTSlideShow", (val) => MainWindow.Settings.Automation.IsAutoFoldInPPTSlideShow = val }, + { "ToggleSwitchAutoFoldInEasiNoteIgnoreDesktopAnno", (val) => MainWindow.Settings.Automation.IsAutoFoldInEasiNoteIgnoreDesktopAnno = val }, + { "ToggleSwitchAutoFoldInOldZyBoard", (val) => MainWindow.Settings.Automation.IsAutoFoldInOldZyBoard = val }, + { "ToggleSwitchKeepFoldAfterSoftwareExit", (val) => MainWindow.Settings.Automation.KeepFoldAfterSoftwareExit = val } + }; + + if (settingMap.ContainsKey(toggleSwitchName)) + { + settingMap[toggleSwitchName](isOn); + MainWindow.SaveSettingsToFile(); + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"更新自动收纳设置失败: {ex.Message}"); + } + } + + /// + /// ToggleSwitch 包装类,用于在找不到实际控件时模拟 ToggleSwitch + /// + private class ToggleSwitchWrapper + { + public bool IsOn { get; set; } + public string Name { get; set; } + } + /// /// 调用 MainWindow 中的 ComboBox 事件处理方法 /// diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/PowerPointPanel.xaml b/Ink Canvas/Windows/SettingsViews/SettingsViews/PowerPointPanel.xaml index a530fc2e..196732e6 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/PowerPointPanel.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/PowerPointPanel.xaml @@ -169,12 +169,12 @@ - - - - - - + + + + + + @@ -182,7 +182,7 @@ - + @@ -201,7 +201,7 @@ - + @@ -252,11 +252,11 @@ - - - - - + + + + + @@ -299,11 +299,11 @@ - - - - - + + + + + diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/PowerPointPanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/PowerPointPanel.xaml.cs index be535ad7..c58b51eb 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/PowerPointPanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/PowerPointPanel.xaml.cs @@ -261,7 +261,7 @@ namespace Ink_Canvas.Windows.SettingsViews if (toggleSwitch == null) return; toggleSwitch.Background = isOn ? new SolidColorBrush(Color.FromRgb(53, 132, 228)) - : new SolidColorBrush(Color.FromRgb(225, 225, 225)); + : ThemeHelper.GetButtonBackgroundBrush(); var innerBorder = toggleSwitch.Child as Border; if (innerBorder != null) { @@ -497,7 +497,7 @@ namespace Ink_Canvas.Windows.SettingsViews } MainWindowSettingsHelper.UpdateSettingDirectly(() => { - pptSettings.PPTTimeCapsulePosition = position; + pptSettings.PPTTimeCapsulePosition = position; }, "PPTTimeCapsulePosition"); break; } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/SettingsPanelBase.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/SettingsPanelBase.cs index 6f4db549..01e9d926 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/SettingsPanelBase.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/SettingsPanelBase.cs @@ -182,7 +182,7 @@ namespace Ink_Canvas.Windows.SettingsViews if (toggleSwitch == null) return; toggleSwitch.Background = isOn ? new SolidColorBrush(Color.FromRgb(53, 132, 228)) - : new SolidColorBrush(Color.FromRgb(225, 225, 225)); + : ThemeHelper.GetButtonBackgroundBrush(); var innerBorder = toggleSwitch.Child as Border; if (innerBorder != null) { diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/SnapshotPanel.xaml b/Ink Canvas/Windows/SettingsViews/SettingsViews/SnapshotPanel.xaml index 00dfc551..16d9cbb3 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/SnapshotPanel.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/SnapshotPanel.xaml @@ -119,6 +119,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/SnapshotPanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/SnapshotPanel.xaml.cs index 6d7f0dc8..7ee1c8f8 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/SnapshotPanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/SnapshotPanel.xaml.cs @@ -135,6 +135,36 @@ namespace Ink_Canvas.Windows.SettingsViews { SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAutoSaveScreenShotInPowerPoint"), MainWindow.Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint); } + + // 墨迹设置 + if (MainWindow.Settings.Canvas != null) + { + var canvas = MainWindow.Settings.Canvas; + + // 绘制圆时显示圆心位置 + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchShowCircleCenter"), canvas.ShowCircleCenter); + + // 使用WPF默认贝塞尔曲线平滑 + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchFitToCurve"), canvas.FitToCurve && !canvas.UseAdvancedBezierSmoothing); + + // 使用高级贝塞尔曲线平滑 + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAdvancedBezierSmoothing"), canvas.UseAdvancedBezierSmoothing); + + // 启用墨迹渐隐功能 + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchEnableInkFade"), canvas.EnableInkFade); + if (InkFadeTimePanel != null) + { + InkFadeTimePanel.Visibility = canvas.EnableInkFade ? Visibility.Visible : Visibility.Collapsed; + } + if (InkFadeTimeSlider != null) + { + InkFadeTimeSlider.Value = canvas.InkFadeTime; + if (InkFadeTimeText != null) + { + InkFadeTimeText.Text = $"{canvas.InkFadeTime}ms"; + } + } + } } catch (Exception ex) { @@ -160,7 +190,7 @@ namespace Ink_Canvas.Windows.SettingsViews if (toggleSwitch == null) return; toggleSwitch.Background = isOn ? new SolidColorBrush(Color.FromRgb(53, 132, 228)) - : new SolidColorBrush(Color.FromRgb(225, 225, 225)); + : ThemeHelper.GetButtonBackgroundBrush(); var innerBorder = toggleSwitch.Child as Border; if (innerBorder != null) { @@ -216,6 +246,43 @@ namespace Ink_Canvas.Windows.SettingsViews AutoDelIntervalPanel.Visibility = newState ? Visibility.Visible : Visibility.Collapsed; } break; + + case "ShowCircleCenter": + // 调用 MainWindow 中的方法 + MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchShowCircleCenter", newState); + break; + + case "FitToCurve": + // 调用 MainWindow 中的方法 + MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchFitToCurve", newState); + // 处理互斥逻辑 + if (newState) + { + MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchAdvancedBezierSmoothing", false); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchAdvancedBezierSmoothing"), false); + } + break; + + case "AdvancedBezierSmoothing": + // 调用 MainWindow 中的方法 + MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchAdvancedBezierSmoothing", newState); + // 处理互斥逻辑 + if (newState) + { + MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchFitToCurve", false); + SetToggleSwitchState(FindToggleSwitch("ToggleSwitchFitToCurve"), false); + } + break; + + case "EnableInkFade": + // 调用 MainWindow 中的方法 + MainWindowSettingsHelper.InvokeToggleSwitchToggled("ToggleSwitchEnableInkFade", newState); + // 更新UI状态 + if (InkFadeTimePanel != null) + { + InkFadeTimePanel.Visibility = newState ? Visibility.Visible : Visibility.Collapsed; + } + break; } } @@ -259,10 +326,10 @@ namespace Ink_Canvas.Windows.SettingsViews { var mainWindow = Application.Current.MainWindow as MainWindow; if (mainWindow != null) - { + { var textBox = mainWindow.FindName("AutoSavedStrokesLocation") as System.Windows.Controls.TextBox; if (textBox != null) - { + { AutoSavedStrokesLocation.Text = textBox.Text; } } @@ -303,6 +370,21 @@ namespace Ink_Canvas.Windows.SettingsViews } } + /// + /// 墨迹渐隐时间滑块值变化事件处理 + /// + private void InkFadeTimeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (!_isLoaded) return; + if (InkFadeTimeSlider != null && InkFadeTimeText != null) + { + int value = (int)InkFadeTimeSlider.Value; + InkFadeTimeText.Text = $"{value}ms"; + // 调用 MainWindow 中的方法 + MainWindowSettingsHelper.InvokeSliderValueChanged("InkFadeTimeSlider", value); + } + } + /// /// ComboBox选择变化事件处理 /// @@ -337,17 +419,17 @@ namespace Ink_Canvas.Windows.SettingsViews else { // 如果找不到控件,直接更新设置 - string tag = selectedItem.Tag?.ToString(); - if (!string.IsNullOrEmpty(tag) && tag.StartsWith("AutoDelSavedFilesDaysThreshold_")) - { - string daysStr = tag.Replace("AutoDelSavedFilesDaysThreshold_", ""); - if (int.TryParse(daysStr, out int days)) + string tag = selectedItem.Tag?.ToString(); + if (!string.IsNullOrEmpty(tag) && tag.StartsWith("AutoDelSavedFilesDaysThreshold_")) + { + string daysStr = tag.Replace("AutoDelSavedFilesDaysThreshold_", ""); + if (int.TryParse(daysStr, out int days)) { MainWindowSettingsHelper.UpdateSettingDirectly(() => - { - if (MainWindow.Settings.Automation != null) - { - MainWindow.Settings.Automation.AutoDelSavedFilesDaysThreshold = days; + { + if (MainWindow.Settings.Automation != null) + { + MainWindow.Settings.Automation.AutoDelSavedFilesDaysThreshold = days; } }, "ComboBoxAutoDelSavedFilesDaysThreshold"); } @@ -365,12 +447,43 @@ namespace Ink_Canvas.Windows.SettingsViews try { ThemeHelper.ApplyThemeToControl(this); + + // 为所有 ComboBox 添加 DropDownOpened 事件处理,以便在下拉菜单打开时更新颜色 + UpdateComboBoxDropdownTheme(ComboBoxAutoDelSavedFilesDaysThreshold); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"SnapshotPanel 应用主题时出错: {ex.Message}"); } } + + /// + /// 为 ComboBox 添加下拉菜单主题更新 + /// + private void UpdateComboBoxDropdownTheme(System.Windows.Controls.ComboBox comboBox) + { + if (comboBox == null) return; + + // 移除旧的事件处理(如果存在) + comboBox.DropDownOpened -= ComboBox_DropDownOpened; + // 添加新的事件处理 + comboBox.DropDownOpened += ComboBox_DropDownOpened; + } + + /// + /// ComboBox 下拉菜单打开事件处理 + /// + private void ComboBox_DropDownOpened(object sender, EventArgs e) + { + if (sender is System.Windows.Controls.ComboBox comboBox) + { + // 延迟更新,确保 Popup 已经完全创建 + Dispatcher.BeginInvoke(new Action(() => + { + ThemeHelper.UpdateComboBoxDropdownColors(comboBox); + }), System.Windows.Threading.DispatcherPriority.Loaded); + } + } } } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/StartupPanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/StartupPanel.xaml.cs index 488c49cf..0a725ce6 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/StartupPanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/StartupPanel.xaml.cs @@ -218,7 +218,9 @@ namespace Ink_Canvas.Windows.SettingsViews private void SetToggleSwitchState(Border toggleSwitch, bool isOn) { if (toggleSwitch == null) return; - toggleSwitch.Background = isOn ? new SolidColorBrush(Color.FromRgb(53, 132, 228)) : new SolidColorBrush(Color.FromRgb(225, 225, 225)); + toggleSwitch.Background = isOn + ? new SolidColorBrush(Color.FromRgb(53, 132, 228)) + : ThemeHelper.GetButtonBackgroundBrush(); var innerBorder = toggleSwitch.Child as Border; if (innerBorder != null) { @@ -509,12 +511,44 @@ namespace Ink_Canvas.Windows.SettingsViews // 使用 ThemeHelper 递归更新其他元素 ThemeHelper.ApplyThemeToControl(this); + + // 为所有 ComboBox 添加 DropDownOpened 事件处理,以便在下拉菜单打开时更新颜色 + UpdateComboBoxDropdownTheme(AutoUpdateWithSilenceStartTimeComboBox); + UpdateComboBoxDropdownTheme(AutoUpdateWithSilenceEndTimeComboBox); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"StartupPanel 应用主题时出错: {ex.Message}"); } } + + /// + /// 为 ComboBox 添加下拉菜单主题更新 + /// + private void UpdateComboBoxDropdownTheme(System.Windows.Controls.ComboBox comboBox) + { + if (comboBox == null) return; + + // 移除旧的事件处理(如果存在) + comboBox.DropDownOpened -= ComboBox_DropDownOpened; + // 添加新的事件处理 + comboBox.DropDownOpened += ComboBox_DropDownOpened; + } + + /// + /// ComboBox 下拉菜单打开事件处理 + /// + private void ComboBox_DropDownOpened(object sender, EventArgs e) + { + if (sender is System.Windows.Controls.ComboBox comboBox) + { + // 延迟更新,确保 Popup 已经完全创建 + Dispatcher.BeginInvoke(new Action(() => + { + ThemeHelper.UpdateComboBoxDropdownColors(comboBox); + }), System.Windows.Threading.DispatcherPriority.Loaded); + } + } } } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/ThemeHelper.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/ThemeHelper.cs index 7bcedb6e..8459e72d 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/ThemeHelper.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/ThemeHelper.cs @@ -1,3 +1,5 @@ +using System; +using System.Windows; using System.Windows.Media; using Ink_Canvas; @@ -276,6 +278,28 @@ namespace Ink_Canvas.Windows.SettingsViews comboBox.Foreground = GetTextPrimaryBrush(); } } + // 更新 ComboBox 背景色 + var background = comboBox.Background as SolidColorBrush; + if (background != null) + { + var color = background.Color; + if (color.R == 255 && color.G == 255 && color.B == 255) // 白色背景 + { + comboBox.Background = GetTextBoxBackgroundBrush(); + } + } + // 更新 ComboBox 边框颜色 + var borderBrush = comboBox.BorderBrush as SolidColorBrush; + if (borderBrush != null) + { + var color = borderBrush.Color; + if (color.R == 230 && color.G == 230 && color.B == 230) // #e6e6e6 + { + comboBox.BorderBrush = GetBorderPrimaryBrush(); + } + } + // 更新 ComboBoxItem 颜色 + UpdateComboBoxItemColors(comboBox); } UpdateInputControlsColors(child); } @@ -453,6 +477,396 @@ namespace Ink_Canvas.Windows.SettingsViews }; } + /// + /// 更新 ComboBoxItem 的颜色 + /// + private static void UpdateComboBoxItemColors(System.Windows.Controls.ComboBox comboBox) + { + try + { + // 更新下拉菜单中的 ComboBoxItem + if (comboBox.Items.Count > 0) + { + foreach (var item in comboBox.Items) + { + if (item is System.Windows.Controls.ComboBoxItem comboBoxItem) + { + var foreground = comboBoxItem.Foreground as SolidColorBrush; + if (foreground != null) + { + var color = foreground.Color; + if (color.R == 46 && color.G == 52 && color.B == 54) // #2e3436 + { + comboBoxItem.Foreground = GetTextPrimaryBrush(); + } + } + var background = comboBoxItem.Background as SolidColorBrush; + if (background != null) + { + var color = background.Color; + if (color.R == 255 && color.G == 255 && color.B == 255) // 白色背景 + { + comboBoxItem.Background = GetTextBoxBackgroundBrush(); + } + } + } + } + } + } + catch + { + // 忽略错误 + } + } + + /// + /// 更新 ComboBox 下拉菜单的颜色(在 ComboBox 打开时调用) + /// + public static void UpdateComboBoxDropdownColors(System.Windows.Controls.ComboBox comboBox) + { + try + { + if (comboBox == null || !comboBox.IsDropDownOpen) return; + + // 通过 VisualTreeHelper 查找 Popup + System.Windows.Controls.Primitives.Popup popup = null; + for (int i = 0; i < System.Windows.Media.VisualTreeHelper.GetChildrenCount(comboBox); i++) + { + var child = System.Windows.Media.VisualTreeHelper.GetChild(comboBox, i); + if (child is System.Windows.Controls.Primitives.Popup foundPopup) + { + popup = foundPopup; + break; + } + // 递归查找 + popup = FindPopupInVisualTree(child); + if (popup != null) break; + } + + if (popup == null) + { + // 如果找不到,尝试通过模板查找 + if (comboBox.Template != null) + { + popup = comboBox.Template.FindName("Popup", comboBox) as System.Windows.Controls.Primitives.Popup; + } + } + + if (popup != null && popup.Child is System.Windows.Controls.Border popupBorder) + { + // 更新下拉菜单背景色 + var background = popupBorder.Background as SolidColorBrush; + if (background != null) + { + var color = background.Color; + if (color.R == 255 && color.G == 255 && color.B == 255) // 白色背景 + { + popupBorder.Background = GetTextBoxBackgroundBrush(); + } + } + // 更新下拉菜单边框颜色 + var borderBrush = popupBorder.BorderBrush as SolidColorBrush; + if (borderBrush != null) + { + var color = borderBrush.Color; + if (color.R == 230 && color.G == 230 && color.B == 230) // #e6e6e6 + { + popupBorder.BorderBrush = GetBorderPrimaryBrush(); + } + } + // 更新下拉菜单中的 ComboBoxItem + UpdateComboBoxItemColorsInPopup(popupBorder); + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"更新 ComboBox 下拉菜单颜色时出错: {ex.Message}"); + } + } + + /// + /// 在可视化树中查找 Popup + /// + private static System.Windows.Controls.Primitives.Popup FindPopupInVisualTree(System.Windows.DependencyObject parent) + { + if (parent == null) return null; + + if (parent is System.Windows.Controls.Primitives.Popup popup) + { + return popup; + } + + for (int i = 0; i < System.Windows.Media.VisualTreeHelper.GetChildrenCount(parent); i++) + { + var child = System.Windows.Media.VisualTreeHelper.GetChild(parent, i); + var found = FindPopupInVisualTree(child); + if (found != null) return found; + } + + return null; + } + + /// + /// 更新 ComboBox 下拉菜单的背景色(通过 Popup) + /// + public static void UpdateComboBoxPopupColors(System.Windows.DependencyObject parent) + { + for (int i = 0; i < System.Windows.Media.VisualTreeHelper.GetChildrenCount(parent); i++) + { + var child = System.Windows.Media.VisualTreeHelper.GetChild(parent, i); + if (child is System.Windows.Controls.Primitives.Popup popup) + { + // 查找 Popup 中的 Border(下拉菜单容器) + if (popup.Child is System.Windows.Controls.Border popupBorder) + { + var background = popupBorder.Background as SolidColorBrush; + if (background != null) + { + var color = background.Color; + if (color.R == 255 && color.G == 255 && color.B == 255) // 白色背景 + { + popupBorder.Background = GetTextBoxBackgroundBrush(); + } + } + var borderBrush = popupBorder.BorderBrush as SolidColorBrush; + if (borderBrush != null) + { + var color = borderBrush.Color; + if (color.R == 230 && color.G == 230 && color.B == 230) // #e6e6e6 + { + popupBorder.BorderBrush = GetBorderPrimaryBrush(); + } + } + // 递归更新 Popup 内部的 ComboBoxItem + UpdateComboBoxItemColorsInPopup(popupBorder); + } + } + UpdateComboBoxPopupColors(child); + } + } + + /// + /// 更新 Popup 内部的 ComboBoxItem 颜色 + /// + private static void UpdateComboBoxItemColorsInPopup(System.Windows.DependencyObject parent) + { + for (int i = 0; i < System.Windows.Media.VisualTreeHelper.GetChildrenCount(parent); i++) + { + var child = System.Windows.Media.VisualTreeHelper.GetChild(parent, i); + if (child is System.Windows.Controls.ComboBoxItem comboBoxItem) + { + var foreground = comboBoxItem.Foreground as SolidColorBrush; + if (foreground != null) + { + var color = foreground.Color; + if (color.R == 46 && color.G == 52 && color.B == 54) // #2e3436 + { + comboBoxItem.Foreground = GetTextPrimaryBrush(); + } + } + // 更新默认背景 + var background = comboBoxItem.Background as SolidColorBrush; + if (background != null) + { + var color = background.Color; + if (color.R == 255 && color.G == 255 && color.B == 255) // 白色背景 + { + comboBoxItem.Background = GetTextBoxBackgroundBrush(); + } + } + // 更新样式触发器中的颜色 + UpdateComboBoxItemStyleTriggers(comboBoxItem); + // 更新模板中的 Border 背景色 + UpdateComboBoxItemTemplateBorder(comboBoxItem); + // 为 ComboBoxItem 添加状态变化监听 + AttachComboBoxItemStateHandlers(comboBoxItem); + } + UpdateComboBoxItemColorsInPopup(child); + } + } + + /// + /// 更新 ComboBoxItem 模板中的 Border 背景色 + /// + private static void UpdateComboBoxItemTemplateBorder(System.Windows.Controls.ComboBoxItem comboBoxItem) + { + try + { + if (comboBoxItem.Template == null) return; + + // 查找模板中的 Border + var border = comboBoxItem.Template.FindName("Border", comboBoxItem) as System.Windows.Controls.Border; + if (border != null) + { + var background = border.Background as SolidColorBrush; + if (background != null) + { + var color = background.Color; + // 根据当前状态更新背景色 + if (comboBoxItem.IsSelected) + { + border.Background = GetSelectedBackgroundBrush(); + } + else if (comboBoxItem.IsMouseOver) + { + border.Background = GetHoverBackgroundBrush(); + } + else if (color.R == 255 && color.G == 255 && color.B == 255) // 白色背景 + { + border.Background = GetTextBoxBackgroundBrush(); + } + else if (color.R == 245 && color.G == 245 && color.B == 245) // #f5f5f5 悬停背景 + { + border.Background = GetHoverBackgroundBrush(); + } + else if (color.R == 225 && color.G == 225 && color.B == 225) // #e1e1e1 选中背景 + { + border.Background = GetSelectedBackgroundBrush(); + } + } + } + } + catch + { + // 忽略错误 + } + } + + /// + /// 为 ComboBoxItem 添加状态变化监听 + /// + private static void AttachComboBoxItemStateHandlers(System.Windows.Controls.ComboBoxItem comboBoxItem) + { + try + { + // 移除旧的事件处理(如果存在) + comboBoxItem.MouseEnter -= ComboBoxItem_MouseEnter; + comboBoxItem.MouseLeave -= ComboBoxItem_MouseLeave; + comboBoxItem.Selected -= ComboBoxItem_Selected; + comboBoxItem.Unselected -= ComboBoxItem_Unselected; + + // 添加新的事件处理 + comboBoxItem.MouseEnter += ComboBoxItem_MouseEnter; + comboBoxItem.MouseLeave += ComboBoxItem_MouseLeave; + comboBoxItem.Selected += ComboBoxItem_Selected; + comboBoxItem.Unselected += ComboBoxItem_Unselected; + } + catch + { + // 忽略错误 + } + } + + /// + /// ComboBoxItem 鼠标进入事件处理 + /// + private static void ComboBoxItem_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) + { + if (sender is System.Windows.Controls.ComboBoxItem comboBoxItem && !comboBoxItem.IsSelected) + { + var border = comboBoxItem.Template?.FindName("Border", comboBoxItem) as System.Windows.Controls.Border; + if (border != null) + { + border.Background = GetHoverBackgroundBrush(); + } + } + } + + /// + /// ComboBoxItem 鼠标离开事件处理 + /// + private static void ComboBoxItem_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) + { + if (sender is System.Windows.Controls.ComboBoxItem comboBoxItem && !comboBoxItem.IsSelected) + { + var border = comboBoxItem.Template?.FindName("Border", comboBoxItem) as System.Windows.Controls.Border; + if (border != null) + { + border.Background = GetTextBoxBackgroundBrush(); + } + } + } + + /// + /// ComboBoxItem 选中事件处理 + /// + private static void ComboBoxItem_Selected(object sender, RoutedEventArgs e) + { + if (sender is System.Windows.Controls.ComboBoxItem comboBoxItem) + { + var border = comboBoxItem.Template?.FindName("Border", comboBoxItem) as System.Windows.Controls.Border; + if (border != null) + { + border.Background = GetSelectedBackgroundBrush(); + } + } + } + + /// + /// ComboBoxItem 取消选中事件处理 + /// + private static void ComboBoxItem_Unselected(object sender, RoutedEventArgs e) + { + if (sender is System.Windows.Controls.ComboBoxItem comboBoxItem) + { + var border = comboBoxItem.Template?.FindName("Border", comboBoxItem) as System.Windows.Controls.Border; + if (border != null) + { + if (comboBoxItem.IsMouseOver) + { + border.Background = GetHoverBackgroundBrush(); + } + else + { + border.Background = GetTextBoxBackgroundBrush(); + } + } + } + } + + /// + /// 更新 ComboBoxItem 样式触发器中的颜色 + /// + private static void UpdateComboBoxItemStyleTriggers(System.Windows.Controls.ComboBoxItem comboBoxItem) + { + try + { + if (comboBoxItem.Style == null) return; + + // 更新样式触发器中的颜色 + foreach (var trigger in comboBoxItem.Style.Triggers) + { + if (trigger is System.Windows.Trigger baseTrigger) + { + foreach (var setter in baseTrigger.Setters) + { + if (setter is System.Windows.Setter setterBase) + { + // 更新悬停背景色 + if (setterBase.Property == System.Windows.Controls.Control.BackgroundProperty && + setterBase.Value is SolidColorBrush brush) + { + var color = brush.Color; + if (color.R == 245 && color.G == 245 && color.B == 245) // #f5f5f5 悬停背景 + { + setterBase.Value = GetHoverBackgroundBrush(); + } + else if (color.R == 225 && color.G == 225 && color.B == 225) // #e1e1e1 选中背景 + { + setterBase.Value = GetSelectedBackgroundBrush(); + } + } + } + } + } + } + } + catch + { + // 忽略错误 + } + } + /// /// 应用主题到整个控件树 /// @@ -464,6 +878,7 @@ namespace Ink_Canvas.Windows.SettingsViews UpdateInputControlsColors(control); UpdateButtonColors(control); UpdateImageIconColors(control); + UpdateComboBoxPopupColors(control); } } } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/ThemePanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/ThemePanel.xaml.cs index 55b071f4..93ab079a 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/ThemePanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/ThemePanel.xaml.cs @@ -230,7 +230,7 @@ namespace Ink_Canvas.Windows.SettingsViews if (toggleSwitch == null) return; toggleSwitch.Background = isOn ? new SolidColorBrush(Color.FromRgb(53, 132, 228)) - : new SolidColorBrush(Color.FromRgb(225, 225, 225)); + : ThemeHelper.GetButtonBackgroundBrush(); var innerBorder = toggleSwitch.Child as Border; if (innerBorder != null) { @@ -563,22 +563,22 @@ namespace Ink_Canvas.Windows.SettingsViews if (comboBox != null) { // 根据 value 找到对应的 ComboBoxItem - int themeIndex; - switch (value) - { - case "Light": - themeIndex = 0; - break; - case "Dark": - themeIndex = 1; - break; - case "System": - themeIndex = 2; - break; - default: - themeIndex = 2; - break; - } + int themeIndex; + switch (value) + { + case "Light": + themeIndex = 0; + break; + case "Dark": + themeIndex = 1; + break; + case "System": + themeIndex = 2; + break; + default: + themeIndex = 2; + break; + } if (comboBox.Items.Count > themeIndex) { @@ -586,7 +586,7 @@ namespace Ink_Canvas.Windows.SettingsViews MainWindowSettingsHelper.InvokeComboBoxSelectionChangedWithThemeCheck("ComboBoxTheme", selectedItem); } else - { + { // 如果找不到控件,直接更新设置并通知主题更新 MainWindowSettingsHelper.UpdateSettingSafely(() => { @@ -622,9 +622,9 @@ namespace Ink_Canvas.Windows.SettingsViews appearance.Theme = themeIndex; }, "ComboBoxTheme_SelectionChanged", "ComboBoxTheme"); MainWindowSettingsHelper.NotifyThemeUpdateIfNeeded("ComboBoxTheme"); - - // 触发主题变化事件,通知设置窗口更新主题 - ThemeChanged?.Invoke(this, new RoutedEventArgs()); + + // 触发主题变化事件,通知设置窗口更新主题 + ThemeChanged?.Invoke(this, new RoutedEventArgs()); } } } @@ -669,7 +669,7 @@ namespace Ink_Canvas.Windows.SettingsViews // 如果找不到控件,直接更新设置 MainWindowSettingsHelper.UpdateSettingDirectly(() => { - appearance.ChickenSoupSource = sourceIndex; + appearance.ChickenSoupSource = sourceIndex; }, "ComboBoxChickenSoupSource"); } } @@ -704,7 +704,7 @@ namespace Ink_Canvas.Windows.SettingsViews // 如果找不到控件,直接更新设置并通知主题更新 MainWindowSettingsHelper.UpdateSettingSafely(() => { - appearance.UnFoldButtonImageType = imgType; + appearance.UnFoldButtonImageType = imgType; }, "ComboBoxUnFoldBtnImg_SelectionChanged", "ComboBoxUnFoldBtnImg"); MainWindowSettingsHelper.NotifyThemeUpdateIfNeeded("ComboBoxUnFoldBtnImg"); } @@ -740,7 +740,7 @@ namespace Ink_Canvas.Windows.SettingsViews // 如果找不到控件,直接更新设置 MainWindowSettingsHelper.UpdateSettingDirectly(() => { - appearance.QuickColorPaletteDisplayMode = displayMode; + appearance.QuickColorPaletteDisplayMode = displayMode; }, "ComboBoxQuickColorPaletteDisplayMode"); } } @@ -781,7 +781,7 @@ namespace Ink_Canvas.Windows.SettingsViews // 如果找不到控件,直接更新设置 MainWindowSettingsHelper.UpdateSettingDirectly(() => { - appearance.EraserDisplayOption = eraserOption; + appearance.EraserDisplayOption = eraserOption; }, "ComboBoxEraserDisplayOption"); } } @@ -797,12 +797,44 @@ namespace Ink_Canvas.Windows.SettingsViews try { ThemeHelper.ApplyThemeToControl(this); + + // 为所有 ComboBox 添加 DropDownOpened 事件处理,以便在下拉菜单打开时更新颜色 + UpdateComboBoxDropdownTheme(ComboBoxSplashScreenStyle); + UpdateComboBoxDropdownTheme(ComboBoxFloatingBarImg); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"ThemePanel 应用主题时出错: {ex.Message}"); } } + + /// + /// 为 ComboBox 添加下拉菜单主题更新 + /// + private void UpdateComboBoxDropdownTheme(System.Windows.Controls.ComboBox comboBox) + { + if (comboBox == null) return; + + // 移除旧的事件处理(如果存在) + comboBox.DropDownOpened -= ComboBox_DropDownOpened; + // 添加新的事件处理 + comboBox.DropDownOpened += ComboBox_DropDownOpened; + } + + /// + /// ComboBox 下拉菜单打开事件处理 + /// + private void ComboBox_DropDownOpened(object sender, EventArgs e) + { + if (sender is System.Windows.Controls.ComboBox comboBox) + { + // 延迟更新,确保 Popup 已经完全创建 + Dispatcher.BeginInvoke(new Action(() => + { + ThemeHelper.UpdateComboBoxDropdownColors(comboBox); + }), System.Windows.Threading.DispatcherPriority.Loaded); + } + } } } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/TimerPanel.xaml b/Ink Canvas/Windows/SettingsViews/SettingsViews/TimerPanel.xaml index b58b2401..3060ba1a 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/TimerPanel.xaml +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/TimerPanel.xaml @@ -94,7 +94,7 @@ - + @@ -125,7 +125,7 @@ - + diff --git a/Ink Canvas/Windows/SettingsViews/SettingsViews/TimerPanel.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsViews/TimerPanel.xaml.cs index 1d0ee8c6..98f6b223 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsViews/TimerPanel.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsViews/TimerPanel.xaml.cs @@ -1,3 +1,5 @@ +using Ink_Canvas; +using iNKORE.UI.WPF.Helpers; using System; using System.Windows; using System.Windows.Controls; @@ -9,9 +11,87 @@ namespace Ink_Canvas.Windows.SettingsViews /// public partial class TimerPanel : UserControl { + private bool _isLoaded = false; + public TimerPanel() { InitializeComponent(); + Loaded += TimerPanel_Loaded; + } + + private void TimerPanel_Loaded(object sender, RoutedEventArgs e) + { + LoadSettings(); + // 添加触摸支持 + MainWindowSettingsHelper.EnableTouchSupportForControls(this); + // 应用主题 + ApplyTheme(); + _isLoaded = true; + } + + /// + /// 加载设置 + /// + public void LoadSettings() + { + if (MainWindow.Settings == null || MainWindow.Settings.RandSettings == null) return; + + _isLoaded = false; + + try + { + var randSettings = MainWindow.Settings.RandSettings; + + // 定时器音量 + if (TimerVolumeSlider != null) + { + TimerVolumeSlider.Value = randSettings.TimerVolume; + if (TimerVolumeText != null) + { + TimerVolumeText.Text = (randSettings.TimerVolume * 100).ToString("F0") + "%"; + } + } + + // 渐进提醒 + var toggleSwitchEnableProgressiveReminder = this.FindDescendantByName("ToggleSwitchEnableProgressiveReminder") as Border; + if (toggleSwitchEnableProgressiveReminder != null) + { + bool isOn = randSettings.EnableProgressiveReminder; + toggleSwitchEnableProgressiveReminder.Background = isOn + ? new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(53, 132, 228)) + : ThemeHelper.GetButtonBackgroundBrush(); + var innerBorder = toggleSwitchEnableProgressiveReminder.Child as Border; + if (innerBorder != null) + { + innerBorder.HorizontalAlignment = isOn ? HorizontalAlignment.Right : HorizontalAlignment.Left; + } + } + + // 渐进提醒音量面板可见性 + var progressiveReminderVolumePanel = this.FindDescendantByName("ProgressiveReminderVolumePanel") as Grid; + if (progressiveReminderVolumePanel != null) + { + progressiveReminderVolumePanel.Visibility = randSettings.EnableProgressiveReminder + ? Visibility.Visible + : Visibility.Collapsed; + } + + // 渐进提醒音量 + if (ProgressiveReminderVolumeSlider != null) + { + ProgressiveReminderVolumeSlider.Value = randSettings.ProgressiveReminderVolume; + if (ProgressiveReminderVolumeText != null) + { + ProgressiveReminderVolumeText.Text = (randSettings.ProgressiveReminderVolume * 100).ToString("F0") + "%"; + } + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"加载定时器设置时出错: {ex.Message}"); + } + + _isLoaded = true; } public event EventHandler IsTopBarNeedShadowEffect; @@ -44,6 +124,31 @@ namespace Ink_Canvas.Windows.SettingsViews System.Diagnostics.Debug.WriteLine($"TimerPanel 应用主题时出错: {ex.Message}"); } } + + /// + /// Slider值变化事件处理 + /// + private void TimerVolumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (!_isLoaded) return; + if (TimerVolumeSlider != null && TimerVolumeText != null) + { + double val = TimerVolumeSlider.Value; + TimerVolumeText.Text = (val * 100).ToString("F0") + "%"; + MainWindowSettingsHelper.InvokeSliderValueChanged("TimerVolumeSlider", val); + } + } + + private void ProgressiveReminderVolumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (!_isLoaded) return; + if (ProgressiveReminderVolumeSlider != null && ProgressiveReminderVolumeText != null) + { + double val = ProgressiveReminderVolumeSlider.Value; + ProgressiveReminderVolumeText.Text = (val * 100).ToString("F0") + "%"; + MainWindowSettingsHelper.InvokeSliderValueChanged("ProgressiveReminderVolumeSlider", val); + } + } } } diff --git a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs index c66b303b..73b1e816 100644 --- a/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs +++ b/Ink Canvas/Windows/SettingsViews/SettingsWindow.xaml.cs @@ -982,7 +982,7 @@ namespace Ink_Canvas.Windows if (SnapshotPane != null) SnapshotPane.Visibility = _selectedSidebarItemName == "SnapshotItem" ? Visibility.Visible : Visibility.Collapsed; if (AdvancedPane != null) AdvancedPane.Visibility = _selectedSidebarItemName == "AdvancedItem" ? Visibility.Visible : Visibility.Collapsed; - // 为新显示的面板应用主题(延迟执行,确保面板已完全显示) + // 为新显示的面板加载设置并应用主题 if (panelMappings.ContainsKey(_selectedSidebarItemName)) { var selectedPanel = panelMappings[_selectedSidebarItemName]; @@ -992,6 +992,15 @@ namespace Ink_Canvas.Windows { try { + // 先加载设置,确保显示的状态与实际一致 + var loadSettingsMethod = selectedPanel.GetType().GetMethod("LoadSettings", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + if (loadSettingsMethod != null) + { + loadSettingsMethod.Invoke(selectedPanel, null); + } + + // 然后应用主题 var applyThemeMethod = selectedPanel.GetType().GetMethod("ApplyTheme", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (applyThemeMethod != null) @@ -1001,7 +1010,7 @@ namespace Ink_Canvas.Windows } catch (Exception ex) { - System.Diagnostics.Debug.WriteLine($"切换面板时应用主题到 {selectedPanel.GetType().Name} 时出错: {ex.Message}"); + System.Diagnostics.Debug.WriteLine($"切换面板时加载设置和应用主题到 {selectedPanel.GetType().Name} 时出错: {ex.Message}"); } }), System.Windows.Threading.DispatcherPriority.Loaded); }