From 512e9b21cd55a91eae2976c3184f9709ad548f77 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 30 Aug 2025 18:10:55 +0800 Subject: [PATCH] improve:issue #143 --- Ink Canvas/MainWindow.xaml.cs | 3 + .../MainWindow_cs/MW_FloatingBarIcons.cs | 152 ++++++++++++++++++ Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs | 13 ++ Ink Canvas/MainWindow_cs/MW_TouchEvents.cs | 56 ++++++- 4 files changed, 220 insertions(+), 4 deletions(-) diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index 4d2e4b8a..043d046f 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -239,6 +239,9 @@ namespace Ink_Canvas // 添加窗口激活事件处理,确保置顶状态在窗口重新激活时得到保持 this.Activated += Window_Activated; this.Deactivated += Window_Deactivated; + + // 为浮动栏按钮添加触摸事件支持 + AddTouchSupportToFloatingBarButtons(); } diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index f70732f8..af76a843 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -3074,6 +3074,158 @@ namespace Ink_Canvas } } + #endregion + + #region 触摸事件支持 + + /// + /// 为浮动栏按钮添加触摸和手写笔事件支持,让触摸和手写笔点击直接调用对应的鼠标点击方法 + /// + private void AddTouchSupportToFloatingBarButtons() + { + // 为主要的浮动栏按钮添加触摸和手写笔事件支持 + if (SymbolIconSelect != null) + { + SymbolIconSelect.TouchDown += (s, e) => SymbolIconSelect_MouseUp(s, null); + SymbolIconSelect.StylusDown += (s, e) => SymbolIconSelect_MouseUp(s, null); + } + + if (SymbolIconUndo != null) + { + SymbolIconUndo.TouchDown += (s, e) => SymbolIconUndo_MouseUp(s, null); + SymbolIconUndo.StylusDown += (s, e) => SymbolIconUndo_MouseUp(s, null); + } + + if (SymbolIconRedo != null) + { + SymbolIconRedo.TouchDown += (s, e) => SymbolIconRedo_MouseUp(s, null); + SymbolIconRedo.StylusDown += (s, e) => SymbolIconRedo_MouseUp(s, null); + } + + if (SymbolIconDelete != null) + { + SymbolIconDelete.TouchDown += (s, e) => SymbolIconDelete_MouseUp(s, null); + SymbolIconDelete.StylusDown += (s, e) => SymbolIconDelete_MouseUp(s, null); + } + + if (ToolsFloatingBarBtn != null) + { + ToolsFloatingBarBtn.TouchDown += (s, e) => SymbolIconTools_MouseUp(s, null); + ToolsFloatingBarBtn.StylusDown += (s, e) => SymbolIconTools_MouseUp(s, null); + } + + if (RandomDrawPanel != null) + { + RandomDrawPanel.TouchDown += (s, e) => SymbolIconRand_MouseUp(s, null); + RandomDrawPanel.StylusDown += (s, e) => SymbolIconRand_MouseUp(s, null); + } + + if (SingleDrawPanel != null) + { + SingleDrawPanel.TouchDown += (s, e) => SymbolIconRandOne_MouseUp(s, null); + SingleDrawPanel.StylusDown += (s, e) => SymbolIconRandOne_MouseUp(s, null); + } + + // 注意:Screenshot和Settings按钮在XAML中没有直接的Name属性,需要通过其他方式绑定 + // 这些按钮的事件处理已经在XAML中通过MouseUp绑定 + + if (BorderFloatingBarMoveControls != null) + { + BorderFloatingBarMoveControls.TouchDown += (s, e) => SymbolIconEmoji_MouseUp(s, null); + BorderFloatingBarMoveControls.StylusDown += (s, e) => SymbolIconEmoji_MouseUp(s, null); + } + + // 白板模式下的按钮不添加触摸事件支持,保持原有的鼠标事件处理 + + // 为快捷调色盘按钮添加触摸和手写笔事件支持 + if (QuickColorWhite != null) + { + QuickColorWhite.TouchDown += (s, e) => QuickColorWhite_Click(s, null); + QuickColorWhite.StylusDown += (s, e) => QuickColorWhite_Click(s, null); + } + + if (QuickColorOrange != null) + { + QuickColorOrange.TouchDown += (s, e) => QuickColorOrange_Click(s, null); + QuickColorOrange.StylusDown += (s, e) => QuickColorOrange_Click(s, null); + } + + if (QuickColorYellow != null) + { + QuickColorYellow.TouchDown += (s, e) => QuickColorYellow_Click(s, null); + QuickColorYellow.StylusDown += (s, e) => QuickColorYellow_Click(s, null); + } + + if (QuickColorBlack != null) + { + QuickColorBlack.TouchDown += (s, e) => QuickColorBlack_Click(s, null); + QuickColorBlack.StylusDown += (s, e) => QuickColorBlack_Click(s, null); + } + + if (QuickColorBlue != null) + { + QuickColorBlue.TouchDown += (s, e) => QuickColorBlue_Click(s, null); + QuickColorBlue.StylusDown += (s, e) => QuickColorBlue_Click(s, null); + } + + if (QuickColorRed != null) + { + QuickColorRed.TouchDown += (s, e) => QuickColorRed_Click(s, null); + QuickColorRed.StylusDown += (s, e) => QuickColorRed_Click(s, null); + } + + if (QuickColorGreen != null) + { + QuickColorGreen.TouchDown += (s, e) => QuickColorGreen_Click(s, null); + QuickColorGreen.StylusDown += (s, e) => QuickColorGreen_Click(s, null); + } + + if (QuickColorPurple != null) + { + QuickColorPurple.TouchDown += (s, e) => QuickColorPurple_Click(s, null); + QuickColorPurple.StylusDown += (s, e) => QuickColorPurple_Click(s, null); + } + + // 单行快捷调色盘 + if (QuickColorWhiteSingle != null) + { + QuickColorWhiteSingle.TouchDown += (s, e) => QuickColorWhite_Click(s, null); + QuickColorWhiteSingle.StylusDown += (s, e) => QuickColorWhite_Click(s, null); + } + + if (QuickColorOrangeSingle != null) + { + QuickColorOrangeSingle.TouchDown += (s, e) => QuickColorOrange_Click(s, null); + QuickColorOrangeSingle.StylusDown += (s, e) => QuickColorOrange_Click(s, null); + } + + if (QuickColorYellowSingle != null) + { + QuickColorYellowSingle.TouchDown += (s, e) => QuickColorYellow_Click(s, null); + QuickColorYellowSingle.StylusDown += (s, e) => QuickColorYellow_Click(s, null); + } + + if (QuickColorBlackSingle != null) + { + QuickColorBlackSingle.TouchDown += (s, e) => QuickColorBlack_Click(s, null); + QuickColorBlackSingle.StylusDown += (s, e) => QuickColorBlack_Click(s, null); + } + + if (QuickColorRedSingle != null) + { + QuickColorRedSingle.TouchDown += (s, e) => QuickColorRed_Click(s, null); + QuickColorRedSingle.StylusDown += (s, e) => QuickColorRed_Click(s, null); + } + + if (QuickColorGreenSingle != null) + { + QuickColorGreenSingle.TouchDown += (s, e) => QuickColorGreen_Click(s, null); + QuickColorGreenSingle.StylusDown += (s, e) => QuickColorGreen_Click(s, null); + } + } + + + #endregion } diff --git a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs index fdaf44ba..5ca45da5 100644 --- a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs +++ b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs @@ -555,6 +555,7 @@ namespace Ink_Canvas { // 禁用原有的FitToCurve,使用新的高级贝塞尔曲线平滑 if (Settings.Canvas.FitToCurve) drawingAttributes.FitToCurve = false; + // 在绘制过程中禁用浮动栏交互,避免干扰绘制 ViewboxFloatingBar.IsHitTestVisible = false; BlackboardUIGridForInkReplay.IsHitTestVisible = false; List pointList; @@ -1668,6 +1669,18 @@ namespace Ink_Canvas private void inkCanvas_MouseDown(object sender, MouseButtonEventArgs e) { + // 检查鼠标点击是否发生在浮动栏区域,如果是则允许事件传播到浮动栏按钮 + var mousePoint = e.GetPosition(this); + var floatingBarBounds = ViewboxFloatingBar.TransformToAncestor(this).TransformBounds( + new Rect(0, 0, ViewboxFloatingBar.ActualWidth, ViewboxFloatingBar.ActualHeight)); + + // 如果鼠标点击发生在浮动栏区域,不阻止事件传播,让浮动栏按钮能够接收鼠标事件 + if (floatingBarBounds.Contains(mousePoint)) + { + // 不设置 ViewboxFloatingBar.IsHitTestVisible = false,让浮动栏按钮能够接收鼠标事件 + return; + } + inkCanvas.CaptureMouse(); ViewboxFloatingBar.IsHitTestVisible = false; BlackboardUIGridForInkReplay.IsHitTestVisible = false; diff --git a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs index f3adbf3a..d24d6f42 100644 --- a/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs +++ b/Ink Canvas/MainWindow_cs/MW_TouchEvents.cs @@ -109,6 +109,18 @@ namespace Ink_Canvas private void MainWindow_TouchDown(object sender, TouchEventArgs e) { + // 检查触摸是否发生在浮动栏区域,如果是则允许事件传播到浮动栏按钮 + var touchPoint = e.GetTouchPoint(this); + var floatingBarBounds = ViewboxFloatingBar.TransformToAncestor(this).TransformBounds( + new Rect(0, 0, ViewboxFloatingBar.ActualWidth, ViewboxFloatingBar.ActualHeight)); + + // 如果触摸发生在浮动栏区域,不阻止事件传播,让浮动栏按钮能够接收触摸事件 + if (floatingBarBounds.Contains(touchPoint.Position)) + { + // 不设置 ViewboxFloatingBar.IsHitTestVisible = false,让浮动栏按钮能够接收触摸事件 + return; + } + if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint || inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke || inkCanvas.EditingMode == InkCanvasEditingMode.Select) return; @@ -139,6 +151,18 @@ namespace Ink_Canvas private void MainWindow_StylusDown(object sender, StylusDownEventArgs e) { + // 检查手写笔点击是否发生在浮动栏区域,如果是则允许事件传播到浮动栏按钮 + var stylusPoint = e.GetPosition(this); + var floatingBarBounds = ViewboxFloatingBar.TransformToAncestor(this).TransformBounds( + new Rect(0, 0, ViewboxFloatingBar.ActualWidth, ViewboxFloatingBar.ActualHeight)); + + // 如果手写笔点击发生在浮动栏区域,不阻止事件传播,让浮动栏按钮能够接收手写笔事件 + if (floatingBarBounds.Contains(stylusPoint)) + { + // 不设置 ViewboxFloatingBar.IsHitTestVisible = false,让浮动栏按钮能够接收手写笔事件 + return; + } + LogHelper.WriteLogToFile($"MainWindow_StylusDown 被调用,笔尾状态: {e.StylusDevice.Inverted}, 当前 drawingShapeMode: {drawingShapeMode}, 当前 EditingMode: {inkCanvas.EditingMode}", LogHelper.LogType.Info); // 新增:根据是否为笔尾自动切换橡皮擦/画笔模式 @@ -323,6 +347,18 @@ namespace Ink_Canvas private void Main_Grid_TouchDown(object sender, TouchEventArgs e) { + // 检查触摸是否发生在浮动栏区域,如果是则允许事件传播到浮动栏按钮 + var touchPoint = e.GetTouchPoint(this); + var floatingBarBounds = ViewboxFloatingBar.TransformToAncestor(this).TransformBounds( + new Rect(0, 0, ViewboxFloatingBar.ActualWidth, ViewboxFloatingBar.ActualHeight)); + + // 如果触摸发生在浮动栏区域,不阻止事件传播,让浮动栏按钮能够接收触摸事件 + if (floatingBarBounds.Contains(touchPoint.Position)) + { + // 不设置 ViewboxFloatingBar.IsHitTestVisible = false,让浮动栏按钮能够接收触摸事件 + return; + } + SetCursorBasedOnEditingMode(inkCanvas); inkCanvas.CaptureTouch(e.TouchDevice); @@ -371,6 +407,18 @@ namespace Ink_Canvas private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e) { + // 检查触摸是否发生在浮动栏区域,如果是则允许事件传播到浮动栏按钮 + var touchPoint = e.GetTouchPoint(this); + var floatingBarBounds = ViewboxFloatingBar.TransformToAncestor(this).TransformBounds( + new Rect(0, 0, ViewboxFloatingBar.ActualWidth, ViewboxFloatingBar.ActualHeight)); + + // 如果触摸发生在浮动栏区域,不阻止事件传播,让浮动栏按钮能够接收触摸事件 + if (floatingBarBounds.Contains(touchPoint.Position)) + { + // 不设置 ViewboxFloatingBar.IsHitTestVisible = false,让浮动栏按钮能够接收触摸事件 + return; + } + // 橡皮状态下不做任何切换,直接return,保证橡皮可持续 if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint || inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke) @@ -391,21 +439,21 @@ namespace Ink_Canvas // 修复:几何绘制模式下,只记录几何绘制的起点,不记录触摸轨迹 if (dec.Count == 0) { - var touchPoint = e.GetTouchPoint(inkCanvas); + var inkTouchPoint = e.GetTouchPoint(inkCanvas); // 对于双曲线绘制,第一笔时记录起点,第二笔时不更新起点 if (drawingShapeMode == 24 || drawingShapeMode == 25) { // 双曲线绘制:第一笔记录起点,第二笔保持第一笔的起点 if (drawMultiStepShapeCurrentStep == 0) { - iniP = touchPoint.Position; + iniP = inkTouchPoint.Position; } // 第二笔时不更新iniP,保持第一笔的起点 } else { // 其他图形正常记录起点 - iniP = touchPoint.Position; + iniP = inkTouchPoint.Position; } lastTouchDownStrokeCollection = inkCanvas.Strokes.Clone(); } @@ -488,7 +536,7 @@ namespace Ink_Canvas // 设备1个的时候,记录中心点 if (dec.Count == 1) { - var touchPoint = e.GetTouchPoint(inkCanvas); + touchPoint = e.GetTouchPoint(inkCanvas); centerPoint = touchPoint.Position; // 修复:只允许在此处赋值iniP,防止TouchMove等其他地方覆盖,保证几何绘制起点一致