feat(工具栏设置): 添加工具栏配置页面及功能实现

实现工具栏配置页面,允许用户调整工具栏按钮的顺序和可见性
包含主工具栏、画布控制和尾部按钮三个区域的配置
支持恢复默认布局功能
This commit is contained in:
PrefacedCorg
2026-05-02 13:41:02 +08:00
parent 7736d88657
commit 723c0b9cdc
18 changed files with 714 additions and 206 deletions
+1 -1
View File
@@ -35,7 +35,7 @@ namespace Ink_Canvas
{
AnimationsHelper.HideWithSlideAndFade(EraserSizePanel);
AnimationsHelper.HideWithSlideAndFade(BorderTools);
AnimationsHelper.HideWithSlideAndFade(BoardBorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(PenPalette);
AnimationsHelper.HideWithSlideAndFade(BoardPenPalette);
AnimationsHelper.HideWithSlideAndFade(BorderDrawShape);
+10 -10
View File
@@ -295,7 +295,7 @@ namespace Ink_Canvas
private void HideSubPanelsImmediately()
{
BorderTools.Visibility = Visibility.Collapsed;
BoardBorderTools.Visibility = Visibility.Collapsed;
BoardBorderToolsPopup.IsOpen = false;
PenPalette.Visibility = Visibility.Collapsed;
BoardPenPalette.Visibility = Visibility.Collapsed;
BoardEraserSizePanel.Visibility = Visibility.Collapsed;
@@ -377,7 +377,7 @@ namespace Ink_Canvas
internal async void HideSubPanels(string mode = null, bool autoAlignCenter = false)
{
AnimationsHelper.HideWithSlideAndFade(BorderTools);
AnimationsHelper.HideWithSlideAndFade(BoardBorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(PenPalette);
AnimationsHelper.HideWithSlideAndFade(BoardPenPalette);
AnimationsHelper.HideWithSlideAndFade(BoardEraserSizePanel);
@@ -1100,7 +1100,7 @@ namespace Ink_Canvas
LeftUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
RightUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
AnimationsHelper.HideWithSlideAndFade(BorderTools);
AnimationsHelper.HideWithSlideAndFade(BoardBorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel);
if (Settings.RandSettings?.UseNewStyleUI == true)
@@ -1152,7 +1152,7 @@ namespace Ink_Canvas
private void OperatingGuideWindowIcon_MouseUp(object sender, MouseButtonEventArgs e)
{
AnimationsHelper.HideWithSlideAndFade(BorderTools);
AnimationsHelper.HideWithSlideAndFade(BoardBorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel);
new OperatingGuideWindow().Show();
@@ -1172,7 +1172,7 @@ namespace Ink_Canvas
RightUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
AnimationsHelper.HideWithSlideAndFade(BorderTools);
AnimationsHelper.HideWithSlideAndFade(BoardBorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel);
// 根据设置决定使用哪个点名窗口
@@ -1307,7 +1307,7 @@ namespace Ink_Canvas
RightUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
AnimationsHelper.HideWithSlideAndFade(BorderTools);
AnimationsHelper.HideWithSlideAndFade(BoardBorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel);
// 检查是否启用了外部点名功能
@@ -1386,7 +1386,7 @@ namespace Ink_Canvas
//if (lastBorderMouseDownObject != sender) return;
AnimationsHelper.HideWithSlideAndFade(BorderTools);
AnimationsHelper.HideWithSlideAndFade(BoardBorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel);
CollapseBorderDrawShape();
@@ -1687,10 +1687,10 @@ namespace Ink_Canvas
/// <param name="e">鼠标按钮事件参数</param>
internal void SymbolIconTools_MouseUp(object sender, MouseButtonEventArgs e)
{
if (BorderTools.Visibility == Visibility.Visible || BoardBorderTools.Visibility == Visibility.Visible)
if (BorderTools.Visibility == Visibility.Visible || BoardBorderToolsPopup.IsOpen)
{
AnimationsHelper.HideWithSlideAndFade(BorderTools);
AnimationsHelper.HideWithSlideAndFade(BoardBorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
}
else
{
@@ -1702,7 +1702,7 @@ namespace Ink_Canvas
}
else
{
AnimationsHelper.ShowWithSlideFromBottomAndFade(BoardBorderTools);
AnimationsHelper.ShowPopupWithSlideAndFade(BoardBorderToolsPopup);
}
}
}
@@ -99,7 +99,7 @@ namespace Ink_Canvas
if (lastBorderMouseDownObject != sender || inkCanvas.Visibility != Visibility.Visible) return;
AnimationsHelper.HideWithSlideAndFade(BorderTools);
AnimationsHelper.HideWithSlideAndFade(BoardBorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
GridNotifications.Visibility = Visibility.Collapsed;
@@ -917,7 +917,7 @@ namespace Ink_Canvas
{
if (lastBorderMouseDownObject != sender) return;
AnimationsHelper.HideWithSlideAndFade(BorderTools);
AnimationsHelper.HideWithSlideAndFade(BoardBorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
var openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = Settings.Automation.AutoSavedStrokesLocation;
+40 -16
View File
@@ -1,5 +1,7 @@
using System;
using Ink_Canvas.Controls;
using Ink_Canvas.Controls.Toolbar;
using Ink_Canvas.Helpers;
using System.Collections.Generic;
using System.Windows.Controls;
@@ -7,8 +9,6 @@ namespace Ink_Canvas
{
public partial class MainWindow
{
// 这批属性替代了 XAML 中原有的 x:Name 自动生成字段;外部代码继续按原名访问。
// 由对应 Toolbar Item 的 AfterBuild 回填,Populate 发生在 Window_Loaded 早期。
internal ToolbarImageButton SymbolIconDelete { get; private set; }
internal ToolbarImageButton Eraser_Icon { get; private set; }
internal ToolbarImageButton EraserByStrokes_Icon { get; private set; }
@@ -35,22 +35,46 @@ namespace Ink_Canvas
internal void AttachToolsBtn(ToolbarImageButton btn) => ToolsFloatingBarBtn = btn;
internal void AttachFoldIcon(ToolbarImageButton btn) => Fold_Icon = btn;
/// <summary>
/// 在 Window_Loaded 早期调用:按 Settings.Toolbar 配置把插件化按钮填充到对应容器。
/// 必须在 LoadSettings 之前,因为 LoadSettings 会访问 Cursor_Icon/Pen_Icon/Eraser_Icon 等。
/// </summary>
internal void InitializeToolbarPlugins()
{
ToolbarHost = new ToolbarHost(this);
var slots = new Dictionary<ToolbarSlot, Panel>
LogHelper.WriteLogToFile("MW_Toolbar: InitializeToolbarPlugins 开始", LogHelper.LogType.Info);
try
{
{ ToolbarSlot.FloatingBarMain, StackPanelFloatingBar },
{ ToolbarSlot.FloatingBarCanvasControls, StackPanelCanvasControls },
{ ToolbarSlot.FloatingBarEnd, StackPanelFloatingBarEnd },
{ ToolbarSlot.BlackboardLeft, BlackboardLeftSide },
{ ToolbarSlot.BlackboardRight, BlackboardRightSide }
};
ToolbarRegistry.Populate(ToolbarHost, slots, Settings?.Toolbar);
ToolbarHost = new ToolbarHost(this);
var slots = new Dictionary<ToolbarSlot, Panel>
{
{ ToolbarSlot.FloatingBarMain, StackPanelFloatingBar },
{ ToolbarSlot.FloatingBarCanvasControls, StackPanelCanvasControls },
{ ToolbarSlot.FloatingBarEnd, StackPanelFloatingBarEnd },
{ ToolbarSlot.BlackboardLeft, BlackboardLeftSide },
{ ToolbarSlot.BlackboardRight, BlackboardRightSide }
};
ToolbarRegistry.Populate(ToolbarHost, slots, Settings?.Toolbar);
LogHelper.WriteLogToFile("MW_Toolbar: InitializeToolbarPlugins 完成", LogHelper.LogType.Info);
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"MW_Toolbar: InitializeToolbarPlugins 异常: {ex.GetType().Name}: {ex.Message}\n{ex.StackTrace}", LogHelper.LogType.Error);
}
}
internal void RebuildToolbar()
{
LogHelper.WriteLogToFile("MW_Toolbar: RebuildToolbar 开始", LogHelper.LogType.Info);
try
{
ToolbarRegistry.ClearInjected(StackPanelFloatingBar);
ToolbarRegistry.ClearInjected(StackPanelCanvasControls);
ToolbarRegistry.ClearInjected(StackPanelFloatingBarEnd);
ToolbarRegistry.ClearInjected(BlackboardLeftSide);
ToolbarRegistry.ClearInjected(BlackboardRightSide);
InitializeToolbarPlugins();
LogHelper.WriteLogToFile("MW_Toolbar: RebuildToolbar 完成", LogHelper.LogType.Info);
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"MW_Toolbar: RebuildToolbar 异常: {ex.GetType().Name}: {ex.Message}\n{ex.StackTrace}", LogHelper.LogType.Error);
}
}
}
}
}