improve:issue #143
This commit is contained in:
@@ -239,6 +239,9 @@ namespace Ink_Canvas
|
|||||||
// 添加窗口激活事件处理,确保置顶状态在窗口重新激活时得到保持
|
// 添加窗口激活事件处理,确保置顶状态在窗口重新激活时得到保持
|
||||||
this.Activated += Window_Activated;
|
this.Activated += Window_Activated;
|
||||||
this.Deactivated += Window_Deactivated;
|
this.Deactivated += Window_Deactivated;
|
||||||
|
|
||||||
|
// 为浮动栏按钮添加触摸事件支持
|
||||||
|
AddTouchSupportToFloatingBarButtons();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3074,6 +3074,158 @@ namespace Ink_Canvas
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 触摸事件支持
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 为浮动栏按钮添加触摸和手写笔事件支持,让触摸和手写笔点击直接调用对应的鼠标点击方法
|
||||||
|
/// </summary>
|
||||||
|
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
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -555,6 +555,7 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
// 禁用原有的FitToCurve,使用新的高级贝塞尔曲线平滑
|
// 禁用原有的FitToCurve,使用新的高级贝塞尔曲线平滑
|
||||||
if (Settings.Canvas.FitToCurve) drawingAttributes.FitToCurve = false;
|
if (Settings.Canvas.FitToCurve) drawingAttributes.FitToCurve = false;
|
||||||
|
// 在绘制过程中禁用浮动栏交互,避免干扰绘制
|
||||||
ViewboxFloatingBar.IsHitTestVisible = false;
|
ViewboxFloatingBar.IsHitTestVisible = false;
|
||||||
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
|
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
|
||||||
List<Point> pointList;
|
List<Point> pointList;
|
||||||
@@ -1668,6 +1669,18 @@ namespace Ink_Canvas
|
|||||||
|
|
||||||
private void inkCanvas_MouseDown(object sender, MouseButtonEventArgs e)
|
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();
|
inkCanvas.CaptureMouse();
|
||||||
ViewboxFloatingBar.IsHitTestVisible = false;
|
ViewboxFloatingBar.IsHitTestVisible = false;
|
||||||
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
|
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
|
||||||
|
|||||||
@@ -109,6 +109,18 @@ namespace Ink_Canvas
|
|||||||
|
|
||||||
private void MainWindow_TouchDown(object sender, TouchEventArgs e)
|
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
|
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint
|
||||||
|| inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke
|
|| inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke
|
||||||
|| inkCanvas.EditingMode == InkCanvasEditingMode.Select) return;
|
|| inkCanvas.EditingMode == InkCanvasEditingMode.Select) return;
|
||||||
@@ -139,6 +151,18 @@ namespace Ink_Canvas
|
|||||||
|
|
||||||
private void MainWindow_StylusDown(object sender, StylusDownEventArgs e)
|
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);
|
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)
|
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);
|
SetCursorBasedOnEditingMode(inkCanvas);
|
||||||
inkCanvas.CaptureTouch(e.TouchDevice);
|
inkCanvas.CaptureTouch(e.TouchDevice);
|
||||||
|
|
||||||
@@ -371,6 +407,18 @@ namespace Ink_Canvas
|
|||||||
|
|
||||||
private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e)
|
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,保证橡皮可持续
|
// 橡皮状态下不做任何切换,直接return,保证橡皮可持续
|
||||||
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint
|
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint
|
||||||
|| inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke)
|
|| inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke)
|
||||||
@@ -391,21 +439,21 @@ namespace Ink_Canvas
|
|||||||
// 修复:几何绘制模式下,只记录几何绘制的起点,不记录触摸轨迹
|
// 修复:几何绘制模式下,只记录几何绘制的起点,不记录触摸轨迹
|
||||||
if (dec.Count == 0)
|
if (dec.Count == 0)
|
||||||
{
|
{
|
||||||
var touchPoint = e.GetTouchPoint(inkCanvas);
|
var inkTouchPoint = e.GetTouchPoint(inkCanvas);
|
||||||
// 对于双曲线绘制,第一笔时记录起点,第二笔时不更新起点
|
// 对于双曲线绘制,第一笔时记录起点,第二笔时不更新起点
|
||||||
if (drawingShapeMode == 24 || drawingShapeMode == 25)
|
if (drawingShapeMode == 24 || drawingShapeMode == 25)
|
||||||
{
|
{
|
||||||
// 双曲线绘制:第一笔记录起点,第二笔保持第一笔的起点
|
// 双曲线绘制:第一笔记录起点,第二笔保持第一笔的起点
|
||||||
if (drawMultiStepShapeCurrentStep == 0)
|
if (drawMultiStepShapeCurrentStep == 0)
|
||||||
{
|
{
|
||||||
iniP = touchPoint.Position;
|
iniP = inkTouchPoint.Position;
|
||||||
}
|
}
|
||||||
// 第二笔时不更新iniP,保持第一笔的起点
|
// 第二笔时不更新iniP,保持第一笔的起点
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 其他图形正常记录起点
|
// 其他图形正常记录起点
|
||||||
iniP = touchPoint.Position;
|
iniP = inkTouchPoint.Position;
|
||||||
}
|
}
|
||||||
lastTouchDownStrokeCollection = inkCanvas.Strokes.Clone();
|
lastTouchDownStrokeCollection = inkCanvas.Strokes.Clone();
|
||||||
}
|
}
|
||||||
@@ -488,7 +536,7 @@ namespace Ink_Canvas
|
|||||||
// 设备1个的时候,记录中心点
|
// 设备1个的时候,记录中心点
|
||||||
if (dec.Count == 1)
|
if (dec.Count == 1)
|
||||||
{
|
{
|
||||||
var touchPoint = e.GetTouchPoint(inkCanvas);
|
touchPoint = e.GetTouchPoint(inkCanvas);
|
||||||
centerPoint = touchPoint.Position;
|
centerPoint = touchPoint.Position;
|
||||||
|
|
||||||
// 修复:只允许在此处赋值iniP,防止TouchMove等其他地方覆盖,保证几何绘制起点一致
|
// 修复:只允许在此处赋值iniP,防止TouchMove等其他地方覆盖,保证几何绘制起点一致
|
||||||
|
|||||||
Reference in New Issue
Block a user