refactor(设置): 重构设置窗口为独立窗口并移除旧设置面板

移除旧的内置设置面板及相关代码,将设置功能迁移至独立的设置窗口
优化设置窗口的主题同步功能,调整自动化页面布局
This commit is contained in:
PrefacedCorg
2026-04-27 09:40:24 +08:00
parent b4526473fa
commit 4f015fb155
10 changed files with 81 additions and 1104 deletions
+4
View File
@@ -386,6 +386,10 @@ namespace Ink_Canvas
{
operatingGuideWindow.RefreshTheme();
}
else if (window is Windows.SettingsViews.SettingsWindow settingsWindow)
{
settingsWindow.RefreshTheme();
}
}
TimerControl?.RefreshTheme();
+15 -142
View File
@@ -297,7 +297,6 @@ namespace Ink_Canvas
BoardPenPalette.Visibility = Visibility.Collapsed;
BoardEraserSizePanel.Visibility = Visibility.Collapsed;
EraserSizePanel.Visibility = Visibility.Collapsed;
BorderSettings.Visibility = Visibility.Collapsed;
BoardBorderLeftPageListView.Visibility = Visibility.Collapsed;
BoardBorderRightPageListView.Visibility = Visibility.Collapsed;
BoardImageOptionsPanel.Visibility = Visibility.Collapsed;
@@ -393,43 +392,6 @@ namespace Ink_Canvas
AnimationsHelper.HideWithSlideAndFade(bgPalette);
}
if (BorderSettings.Visibility == Visibility.Visible)
{
// 设置蒙版为不可点击,并移除背景
BorderSettingsMask.IsHitTestVisible = false;
BorderSettingsMask.Background = null;
var sb = new Storyboard();
// 滑动动画
var slideAnimation = new DoubleAnimation
{
From = 0, // 滑动距离
To = BorderSettings.RenderTransform.Value.OffsetX - 490,
Duration = TimeSpan.FromSeconds(0.6),
EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut }
};
Storyboard.SetTargetProperty(slideAnimation,
new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.X)"));
sb.Children.Add(slideAnimation);
sb.Completed += (s, _) =>
{
BorderSettings.Visibility = Visibility.Collapsed;
isOpeningOrHidingSettingsPane = false;
if (WindowSettingsHelper.IsTemporarilyDisablingNoFocusMode)
{
WindowSettingsHelper.IsTemporarilyDisablingNoFocusMode = false;
ApplyNoFocusMode();
}
};
BorderSettings.RenderTransform = new TranslateTransform();
isOpeningOrHidingSettingsPane = true;
sb.Begin(BorderSettings);
}
AnimationsHelper.HideWithSlideAndFade(TwoFingerGestureBorder);
AnimationsHelper.HideWithSlideAndFade(EraserSizePanel);
AnimationsHelper.HideWithSlideAndFade(BoardTwoFingerGestureBorder);
@@ -1101,10 +1063,8 @@ namespace Ink_Canvas
/// <param name="e">路由事件参数</param>
private void SymbolIconSettings_Click(object sender, MouseButtonEventArgs e)
{
if (isOpeningOrHidingSettingsPane) return;
HideSubPanels();
BtnSettings_Click(null, null);
}
/// <summary>
/// 截图图标点击事件处理
@@ -3078,17 +3038,6 @@ namespace Ink_Canvas
LogHelper.WriteLogToFile($"停止PPT监控时出错: {ex.Message}", LogHelper.LogType.Error);
}
// 如果当前在设置面板中,需要先恢复无焦点模式状态
if (BorderSettings.Visibility == Visibility.Visible)
{
if (WindowSettingsHelper.IsTemporarilyDisablingNoFocusMode)
{
WindowSettingsHelper.IsTemporarilyDisablingNoFocusMode = false;
ApplyNoFocusMode();
}
SaveSettingsToFile();
}
App.IsAppExitByUser = true;
// 不设置 CloseIsFromButton = true,让它也经过确认流程
Close();
@@ -3101,53 +3050,12 @@ namespace Ink_Canvas
/// <param name="e">路由事件参数</param>
public void BtnRestart_Click(object sender, RoutedEventArgs e)
{
if (BorderSettings.Visibility == Visibility.Visible)
{
if (WindowSettingsHelper.IsTemporarilyDisablingNoFocusMode)
{
WindowSettingsHelper.IsTemporarilyDisablingNoFocusMode = false;
ApplyNoFocusMode();
}
SaveSettingsToFile();
}
Process.Start(System.Windows.Forms.Application.ExecutablePath, "-m");
App.IsAppExitByUser = true;
// 不设置 CloseIsFromButton = true,让它也经过确认流程
Close();
}
/// <summary>
/// 设置覆盖层点击事件处理,用于点击设置面板外部时关闭设置面板
/// </summary>
/// <param name="sender">发送者</param>
/// <param name="e">鼠标按钮事件参数</param>
private void SettingsOverlayClick(object sender, MouseButtonEventArgs e)
{
if (isOpeningOrHidingSettingsPane) return;
// 获取点击的位置
Point clickPoint = e.GetPosition(BorderSettingsMask);
// 获取BorderSettings的位置和大小
Point settingsPosition = BorderSettings.TranslatePoint(new Point(0, 0), BorderSettingsMask);
Rect settingsRect = new Rect(
settingsPosition.X,
settingsPosition.Y,
BorderSettings.ActualWidth,
BorderSettings.ActualHeight
);
// 如果点击位置不在设置界面内部,才关闭设置界面
if (!settingsRect.Contains(clickPoint))
{
BtnSettings_Click(null, null);
}
}
private bool isOpeningOrHidingSettingsPane;
private bool wasNoFocusModeBeforeSettings;
/// <summary>
/// 切换并打开设置面板;在需要时先进行安全密码校验,然后显示设置面板并启动打开动画,同时根据设置暂时调整无焦点模式与遮罩交互状态。
/// </summary>
@@ -3155,60 +3063,25 @@ namespace Ink_Canvas
/// <param name="e">路由事件参数</param>
internal async void BtnSettings_Click(object sender, RoutedEventArgs e)
{
if (BorderSettings.Visibility == Visibility.Visible)
try
{
HideSubPanels();
if (Ink_Canvas.Helpers.SecurityManager.IsPasswordRequiredForEnterSettings(Settings))
{
bool ok = await Ink_Canvas.Helpers.SecurityManager.PromptAndVerifyAsync(Settings, this, "进入设置", "请输入安全密码以进入设置。");
if (!ok) return;
}
}
else
catch (Exception ex)
{
try
{
if (Ink_Canvas.Helpers.SecurityManager.IsPasswordRequiredForEnterSettings(Settings))
{
bool ok = await Ink_Canvas.Helpers.SecurityManager.PromptAndVerifyAsync(Settings, this, "进入设置", "请输入安全密码以进入设置。");
if (!ok) return;
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"安全密码校验失败: {ex}", LogHelper.LogType.Error);
return;
}
BorderSettings.Visibility = Visibility.Visible;
wasNoFocusModeBeforeSettings = Settings.Advanced.IsNoFocusMode;
if (wasNoFocusModeBeforeSettings)
{
WindowSettingsHelper.IsTemporarilyDisablingNoFocusMode = true;
ApplyNoFocusMode();
}
// 设置蒙版为可点击,并添加半透明背景
BorderSettingsMask.IsHitTestVisible = true;
BorderSettingsMask.Background = new SolidColorBrush(Color.FromArgb(1, 0, 0, 0));
SettingsPanelScrollViewer.ScrollToTop();
var sb = new Storyboard();
// 滑动动画
var slideAnimation = new DoubleAnimation
{
From = BorderSettings.RenderTransform.Value.OffsetX - 490, // 滑动距离
To = 0,
Duration = TimeSpan.FromSeconds(0.6),
EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut }
};
Storyboard.SetTargetProperty(slideAnimation,
new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.X)"));
sb.Children.Add(slideAnimation);
sb.Completed += (s, _) => { isOpeningOrHidingSettingsPane = false; };
BorderSettings.RenderTransform = new TranslateTransform();
isOpeningOrHidingSettingsPane = true;
sb.Begin(BorderSettings);
LogHelper.WriteLogToFile($"安全密码校验失败: {ex}", LogHelper.LogType.Error);
return;
}
HideSubPanels();
var settingsWindow = new Windows.SettingsViews.SettingsWindow();
settingsWindow.Owner = this;
settingsWindow.Topmost = this.Topmost;
settingsWindow.ShowDialog();
}
private void BtnThickness_Click(object sender, RoutedEventArgs e) { }
-19
View File
@@ -123,20 +123,6 @@ namespace Ink_Canvas
return true;
}
private bool IsLegacySettingsVisible(MainWindow mainWin)
{
try
{
var borderSettingsField = typeof(MainWindow).GetField("BorderSettings", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
var borderSettings = borderSettingsField?.GetValue(mainWin) as FrameworkElement;
return borderSettings?.Visibility == Visibility.Visible;
}
catch
{
return false;
}
}
private void TempShowMainWindowTrayIconMenuItem_Clicked(object sender, RoutedEventArgs e)
{
var mainWin = Current.MainWindow as MainWindow;
@@ -224,11 +210,6 @@ namespace Ink_Canvas
return;
}
if (IsLegacySettingsVisible(mainWin))
{
return;
}
try
{
var method = typeof(MainWindow).GetMethod("BtnSettings_Click", BindingFlags.NonPublic | BindingFlags.Instance);