refactor(设置): 重构设置窗口为独立窗口并移除旧设置面板
移除旧的内置设置面板及相关代码,将设置功能迁移至独立的设置窗口 优化设置窗口的主题同步功能,调整自动化页面布局
This commit is contained in:
@@ -123,10 +123,8 @@ namespace Ink_Canvas
|
||||
BlackboardCenterSide.Visibility = Visibility.Collapsed;
|
||||
BlackboardRightSide.Visibility = Visibility.Collapsed;
|
||||
BorderTools.Visibility = Visibility.Collapsed;
|
||||
BorderSettings.Visibility = Visibility.Collapsed;
|
||||
LeftSidePanelForPPTNavigation.Visibility = Visibility.Collapsed;
|
||||
RightSidePanelForPPTNavigation.Visibility = Visibility.Collapsed;
|
||||
BorderSettings.Margin = new Thickness(0, 0, 0, 0);
|
||||
TwoFingerGestureBorder.Visibility = Visibility.Collapsed;
|
||||
BoardTwoFingerGestureBorder.Visibility = Visibility.Collapsed;
|
||||
BorderDrawShape.Visibility = Visibility.Collapsed;
|
||||
@@ -1266,12 +1264,6 @@ namespace Ink_Canvas
|
||||
// 设置窗口模式
|
||||
SetWindowMode();
|
||||
|
||||
// 注册设置面板滚动事件
|
||||
if (SettingsPanelScrollViewer != null)
|
||||
{
|
||||
SettingsPanelScrollViewer.ScrollChanged += SettingsPanelScrollViewer_ScrollChanged;
|
||||
}
|
||||
|
||||
// 初始化PPT管理器
|
||||
InitializePPTManagers();
|
||||
|
||||
@@ -2278,457 +2270,6 @@ namespace Ink_Canvas
|
||||
|
||||
#endregion Definations and Loading
|
||||
|
||||
#region Navigation Sidebar Methods
|
||||
|
||||
// 侧边栏导航按钮事件处理
|
||||
private void NavStartup_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 切换到启动设置页面
|
||||
ShowSettingsSection("startup");
|
||||
}
|
||||
|
||||
private void NavCanvas_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 切换到画布设置页面
|
||||
ShowSettingsSection("canvas");
|
||||
}
|
||||
|
||||
private void NavGesture_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 切换到手势设置页面
|
||||
ShowSettingsSection("gesture");
|
||||
}
|
||||
|
||||
private void NavInkRecognition_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 切换到墨迹识别设置页面
|
||||
ShowSettingsSection("inkrecognition");
|
||||
}
|
||||
|
||||
private void NavCrashAction_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 切换到崩溃处理设置页面
|
||||
ShowSettingsSection("crashaction");
|
||||
}
|
||||
|
||||
private void NavPPT_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 切换到PPT设置页面
|
||||
ShowSettingsSection("ppt");
|
||||
}
|
||||
|
||||
private void NavAdvanced_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 切换到高级设置页面
|
||||
ShowSettingsSection("advanced");
|
||||
}
|
||||
|
||||
private void NavAutomation_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 切换到自动化设置页面
|
||||
ShowSettingsSection("automation");
|
||||
}
|
||||
|
||||
private void NavRandomWindow_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 切换到随机窗口设置页面
|
||||
ShowSettingsSection("randomwindow");
|
||||
}
|
||||
|
||||
private void NavAbout_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ShowSettingsSection("about");
|
||||
}
|
||||
|
||||
// 个性化设置
|
||||
private void NavTheme_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 切换到个性化设置页面
|
||||
ShowSettingsSection("theme");
|
||||
}
|
||||
|
||||
// 快捷键设置
|
||||
private void NavShortcuts_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
OpenHotkeySettingsWindow();
|
||||
}
|
||||
|
||||
private void BtnCloseSettings_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 关闭设置面板
|
||||
BorderSettings.Visibility = Visibility.Collapsed;
|
||||
// 设置蒙版为不可点击,并清除背景
|
||||
BorderSettingsMask.IsHitTestVisible = false;
|
||||
BorderSettingsMask.Background = null; // 确保清除蒙层背景
|
||||
}
|
||||
|
||||
// 折叠侧边栏
|
||||
private void CollapseNavSidebar_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 折叠/展开侧边栏
|
||||
var columnDefinitions = ((Grid)BorderSettings.Child).ColumnDefinitions;
|
||||
if (columnDefinitions[0].Width.Value == 50)
|
||||
{
|
||||
// 折叠侧边栏
|
||||
columnDefinitions[0].Width = new GridLength(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 展开侧边栏
|
||||
columnDefinitions[0].Width = new GridLength(50);
|
||||
}
|
||||
}
|
||||
|
||||
// 显示侧边栏
|
||||
private void ShowNavSidebar_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 确保侧边栏展开
|
||||
var columnDefinitions = ((Grid)BorderSettings.Child).ColumnDefinitions;
|
||||
columnDefinitions[0].Width = new GridLength(50);
|
||||
}
|
||||
|
||||
// 显示指定的设置部分
|
||||
private async void ShowSettingsSection(string sectionTag)
|
||||
{
|
||||
// 显示设置面板
|
||||
BorderSettings.Visibility = Visibility.Visible;
|
||||
// 设置蒙版为可点击,并添加半透明背景
|
||||
BorderSettingsMask.IsHitTestVisible = true;
|
||||
BorderSettingsMask.Background = new SolidColorBrush(Color.FromArgb(1, 0, 0, 0));
|
||||
|
||||
// 获取SettingsPanelScrollViewer中的所有GroupBox
|
||||
var stackPanel = SettingsPanelScrollViewer.Content as StackPanel;
|
||||
if (stackPanel == null) return;
|
||||
|
||||
// 确保所有GroupBox都是可见的
|
||||
foreach (var child in stackPanel.Children)
|
||||
{
|
||||
if (child is GroupBox groupBox)
|
||||
{
|
||||
groupBox.Visibility = Visibility.Visible;
|
||||
}
|
||||
}
|
||||
|
||||
// 确保UI完全更新
|
||||
await Dispatcher.InvokeAsync(() => { }, DispatcherPriority.Render);
|
||||
|
||||
// 根据传入的sectionTag滚动到相应的设置部分
|
||||
GroupBox targetGroupBox = null;
|
||||
|
||||
switch (sectionTag.ToLower())
|
||||
{
|
||||
case "startup":
|
||||
case "crashaction":
|
||||
{
|
||||
var sw = new Windows.SettingsViews.SettingsWindow();
|
||||
sw.Owner = this;
|
||||
sw.NavigateToPage("StartupPage");
|
||||
sw.ShowDialog();
|
||||
return;
|
||||
}
|
||||
case "gesture":
|
||||
{
|
||||
var sw = new Windows.SettingsViews.SettingsWindow();
|
||||
sw.Owner = this;
|
||||
sw.NavigateToPage("CanvasPage");
|
||||
sw.ShowDialog();
|
||||
return;
|
||||
}
|
||||
case "ppt":
|
||||
{
|
||||
var sw = new Windows.SettingsViews.SettingsWindow();
|
||||
sw.Owner = this;
|
||||
sw.NavigateToPage("PowerPointPage");
|
||||
sw.ShowDialog();
|
||||
return;
|
||||
}
|
||||
case "advanced":
|
||||
{
|
||||
var sw = new Windows.SettingsViews.SettingsWindow();
|
||||
sw.Owner = this;
|
||||
sw.NavigateToPage("AdvancedPage");
|
||||
sw.ShowDialog();
|
||||
return;
|
||||
}
|
||||
case "automation":
|
||||
{
|
||||
var sw = new Windows.SettingsViews.SettingsWindow();
|
||||
sw.Owner = this;
|
||||
sw.NavigateToPage("AutomationPage");
|
||||
sw.ShowDialog();
|
||||
return;
|
||||
}
|
||||
case "randomwindow":
|
||||
{
|
||||
var sw = new Windows.SettingsViews.SettingsWindow();
|
||||
sw.Owner = this;
|
||||
sw.NavigateToPage("RandomDrawPage");
|
||||
sw.ShowDialog();
|
||||
return;
|
||||
}
|
||||
case "theme":
|
||||
{
|
||||
var sw = new Windows.SettingsViews.SettingsWindow();
|
||||
sw.Owner = this;
|
||||
sw.NavigateToPage("AppearancePage");
|
||||
sw.ShowDialog();
|
||||
return;
|
||||
}
|
||||
case "shortcuts":
|
||||
// 快捷键设置部分可能尚未实现
|
||||
targetGroupBox = null;
|
||||
break;
|
||||
default:
|
||||
// 默认滚动到顶部
|
||||
SettingsPanelScrollViewer.ScrollToTop();
|
||||
return;
|
||||
}
|
||||
|
||||
// 如果找到目标GroupBox,则滚动到它的位置
|
||||
if (targetGroupBox != null)
|
||||
{
|
||||
// 使用动画平滑滚动到目标位置
|
||||
ScrollToElement(targetGroupBox);
|
||||
|
||||
// 高亮显示当前选中的导航项
|
||||
UpdateNavigationButtonState(sectionTag);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果没有找到目标GroupBox,则滚动到顶部
|
||||
SettingsPanelScrollViewer.ScrollToTop();
|
||||
}
|
||||
}
|
||||
|
||||
// 根据Header文本查找GroupBox
|
||||
private GroupBox FindGroupBoxByHeader(StackPanel parent, string headerText)
|
||||
{
|
||||
foreach (var child in parent.Children)
|
||||
{
|
||||
if (child is GroupBox groupBox)
|
||||
{
|
||||
// 查找GroupBox的Header
|
||||
if (groupBox.Header is TextBlock headerTextBlock &&
|
||||
headerTextBlock.Text != null &&
|
||||
headerTextBlock.Text.Contains(headerText))
|
||||
{
|
||||
return groupBox;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// 平滑滚动到指定元素
|
||||
private async void ScrollToElement(FrameworkElement element)
|
||||
{
|
||||
if (element == null || SettingsPanelScrollViewer == null) return;
|
||||
|
||||
try
|
||||
{
|
||||
// 暂时禁用滚动事件处理
|
||||
SettingsPanelScrollViewer.ScrollChanged -= SettingsPanelScrollViewer_ScrollChanged;
|
||||
|
||||
// 记录当前滚动位置
|
||||
double originalOffset = SettingsPanelScrollViewer.VerticalOffset;
|
||||
|
||||
// 将ScrollViewer内部的位置信息重置到顶部(不会触发视觉更新)
|
||||
SettingsPanelScrollViewer.ScrollToHome();
|
||||
|
||||
// 使用Dispatcher进行延迟处理,确保布局更新
|
||||
await Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
// 强制更新布局
|
||||
SettingsPanelScrollViewer.UpdateLayout();
|
||||
|
||||
// 获取元素相对于顶部的准确位置
|
||||
Point elementPosition = element.TransformToAncestor(SettingsPanelScrollViewer).Transform(new Point(0, 0));
|
||||
|
||||
// 计算目标位置,减去一些偏移,使元素不会贴在顶部
|
||||
double targetPosition = elementPosition.Y - 20;
|
||||
|
||||
// 确保目标位置不小于0
|
||||
targetPosition = Math.Max(0, targetPosition);
|
||||
|
||||
// 直接设置滚动位置,不使用动画
|
||||
SettingsPanelScrollViewer.ScrollToVerticalOffset(targetPosition);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// 如果出现异常,恢复到原来的滚动位置
|
||||
SettingsPanelScrollViewer.ScrollToVerticalOffset(originalOffset);
|
||||
}
|
||||
finally
|
||||
{
|
||||
// 重新启用滚动事件处理
|
||||
SettingsPanelScrollViewer.ScrollChanged += SettingsPanelScrollViewer_ScrollChanged;
|
||||
}
|
||||
}, DispatcherPriority.Render);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// 确保在异常情况下也重新启用滚动事件处理
|
||||
SettingsPanelScrollViewer.ScrollChanged += SettingsPanelScrollViewer_ScrollChanged;
|
||||
}
|
||||
}
|
||||
|
||||
// 滚动条变化事件处理
|
||||
private void SettingsPanelScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
|
||||
{
|
||||
// 可以在这里添加滚动事件的处理逻辑,如果需要的话
|
||||
}
|
||||
|
||||
// 更新导航按钮状态
|
||||
private void UpdateNavigationButtonState(string activeTag)
|
||||
{
|
||||
// 清除所有导航按钮的Tag属性
|
||||
ClearAllNavButtonTags();
|
||||
|
||||
// 设置当前活动按钮的Tag属性
|
||||
switch (activeTag.ToLower())
|
||||
{
|
||||
case "startup":
|
||||
SetNavButtonTag("startup");
|
||||
break;
|
||||
case "canvas":
|
||||
SetNavButtonTag("canvas");
|
||||
break;
|
||||
case "gesture":
|
||||
SetNavButtonTag("gesture");
|
||||
break;
|
||||
case "inkrecognition":
|
||||
SetNavButtonTag("inkrecognition");
|
||||
break;
|
||||
case "crashaction":
|
||||
SetNavButtonTag("crashaction");
|
||||
break;
|
||||
case "ppt":
|
||||
SetNavButtonTag("ppt");
|
||||
break;
|
||||
case "advanced":
|
||||
{
|
||||
var sw = new Windows.SettingsViews.SettingsWindow();
|
||||
sw.Owner = this;
|
||||
sw.NavigateToPage("AdvancedPage");
|
||||
sw.ShowDialog();
|
||||
return;
|
||||
}
|
||||
case "automation":
|
||||
SetNavButtonTag("automation");
|
||||
break;
|
||||
case "randomwindow":
|
||||
SetNavButtonTag("randomwindow");
|
||||
break;
|
||||
case "theme":
|
||||
SetNavButtonTag("theme");
|
||||
break;
|
||||
case "shortcuts":
|
||||
SetNavButtonTag("shortcuts");
|
||||
break;
|
||||
case "about":
|
||||
SetNavButtonTag("about");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 清除所有导航按钮的Tag属性
|
||||
private void ClearAllNavButtonTags()
|
||||
{
|
||||
var grid = BorderSettings.Child as Grid;
|
||||
if (grid == null) return;
|
||||
|
||||
var navSidebar = grid.Children[0] as Border;
|
||||
if (navSidebar == null) return;
|
||||
|
||||
var navGrid = navSidebar.Child as Grid;
|
||||
if (navGrid == null) return;
|
||||
|
||||
var scrollViewer = navGrid.Children[1] as ScrollViewer;
|
||||
if (scrollViewer == null) return;
|
||||
|
||||
var stackPanel = scrollViewer.Content as StackPanel;
|
||||
if (stackPanel == null) return;
|
||||
|
||||
foreach (var child in stackPanel.Children)
|
||||
{
|
||||
if (child is Button button)
|
||||
{
|
||||
button.Tag = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 设置导航按钮的Tag属性
|
||||
private void SetNavButtonTag(string tag)
|
||||
{
|
||||
var grid = BorderSettings.Child as Grid;
|
||||
if (grid == null) return;
|
||||
|
||||
var navSidebar = grid.Children[0] as Border;
|
||||
if (navSidebar == null) return;
|
||||
|
||||
var navGrid = navSidebar.Child as Grid;
|
||||
if (navGrid == null) return;
|
||||
|
||||
var scrollViewer = navGrid.Children[1] as ScrollViewer;
|
||||
if (scrollViewer == null) return;
|
||||
|
||||
var stackPanel = scrollViewer.Content as StackPanel;
|
||||
if (stackPanel == null) return;
|
||||
|
||||
foreach (var child in stackPanel.Children)
|
||||
{
|
||||
if (child is Button button)
|
||||
{
|
||||
// 检查按钮的ToolTip属性,根据tag设置对应的按钮
|
||||
string buttonTag = button.Tag as string;
|
||||
|
||||
// 如果按钮的Tag与要设置的tag匹配,则设置Tag
|
||||
if (buttonTag != null && buttonTag.ToLower() == tag.ToLower())
|
||||
{
|
||||
button.Tag = tag;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 根据Header文本查找并显示GroupBox
|
||||
private void ShowGroupBoxByHeader(StackPanel parent, string headerText)
|
||||
{
|
||||
foreach (var child in parent.Children)
|
||||
{
|
||||
if (child is GroupBox groupBox)
|
||||
{
|
||||
// 查找GroupBox的Header
|
||||
if (groupBox.Header is TextBlock headerTextBlock &&
|
||||
headerTextBlock.Text != null &&
|
||||
headerTextBlock.Text.Contains(headerText))
|
||||
{
|
||||
groupBox.Visibility = Visibility.Visible;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Navigation Sidebar Methods
|
||||
|
||||
#region 新设置窗口
|
||||
private async void BtnOpenNewNewSettings_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (isOpeningOrHidingSettingsPane) return;
|
||||
HideSubPanels();
|
||||
{
|
||||
var settingsWindow = new Windows.SettingsViews.SettingsWindow();
|
||||
settingsWindow.Owner = this;
|
||||
settingsWindow.ShowDialog();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion 新设置窗口
|
||||
|
||||
// 在MainWindow类中添加:
|
||||
private void ApplyCurrentEraserShape()
|
||||
@@ -2798,15 +2339,9 @@ namespace Ink_Canvas
|
||||
|
||||
private void HistoryRollbackButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// 收起设置面板(与插件面板一致)
|
||||
BorderSettings.Visibility = Visibility.Hidden;
|
||||
BorderSettingsMask.Visibility = Visibility.Hidden;
|
||||
var win = new HistoryRollbackWindow(Settings.Startup.UpdateChannel);
|
||||
win.Owner = this;
|
||||
win.ShowDialog();
|
||||
// 可选:回滚窗口关闭后恢复设置面板显示
|
||||
BorderSettings.Visibility = Visibility.Visible;
|
||||
BorderSettingsMask.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
@@ -3009,31 +2544,12 @@ namespace Ink_Canvas
|
||||
return;
|
||||
}
|
||||
|
||||
// 暂时隐藏设置面板
|
||||
BorderSettings.Visibility = Visibility.Hidden;
|
||||
BorderSettingsMask.Visibility = Visibility.Hidden;
|
||||
|
||||
// 创建快捷键设置窗口
|
||||
var hotkeySettingsWindow = new HotkeySettingsWindow(this, _globalHotkeyManager);
|
||||
hotkeySettingsWindow.Owner = this;
|
||||
|
||||
// 设置窗口关闭事件,用于在快捷键设置窗口关闭后恢复设置面板
|
||||
hotkeySettingsWindow.Closed += (s, e) =>
|
||||
{
|
||||
// 恢复设置面板显示
|
||||
BorderSettings.Visibility = Visibility.Visible;
|
||||
BorderSettingsMask.Visibility = Visibility.Visible;
|
||||
};
|
||||
|
||||
// 显示快捷键设置窗口
|
||||
hotkeySettingsWindow.ShowDialog();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 确保在发生错误时也恢复设置面板显示
|
||||
BorderSettings.Visibility = Visibility.Visible;
|
||||
BorderSettingsMask.Visibility = Visibility.Visible;
|
||||
|
||||
LogHelper.WriteLogToFile($"打开快捷键设置窗口时出错: {ex.Message}", LogHelper.LogType.Error);
|
||||
MessageBox.Show($"打开快捷键设置窗口时出错: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user