feat(docstring):添加部分docstring (#376)
* feat(docstring):添加docstring Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * fix(docstring):修复部分docstring格式错误 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * fix(docstring):修复部分docstring Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * chore(Docstring):MW_* 前14 * chore(Docstring):MW_* part 2 * chore(Docstring):MW_* part 3 * chore:优化缩进 * fix: 修复数学计算中的潜在除零错误和数值稳定性问题 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * chore:删除Rebase时多余的OOBE函数 * chore: 更新代码注释和文档格式 修复XML文档注释中的格式问题,统一使用<c>和<see>标签 更新ConfigHelper类的预留说明,明确未来扩展用途 优化TimerDisplayDate_Elapsed方法的注释,说明UI异步更新机制 合并重复的注释摘要行,提高文档可读性 添加形状识别功能的64位进程限制说明 修正视频呈现器设备选择逻辑的文档说明 * chore(IPPTLinkManager): 更新TryEndSlideShow方法的XML注释格式 * chore: 修正代码注释中的术语和格式问题 更新多个文件中的XML注释,统一使用<see langword="..."/>标记代替<c>...</c>标记 规范术语使用(如"延迟初始化"代替"懒惰初始化") 修正注释中的格式错误和补充说明 调整代码区域的注释对齐格式 --------- Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com>
This commit is contained in:
@@ -17,8 +17,20 @@ namespace Ink_Canvas
|
||||
{
|
||||
#region Floating Control
|
||||
|
||||
/// <summary>
|
||||
/// 存储最后一次鼠标按下的边界对象
|
||||
/// </summary>
|
||||
private object lastBorderMouseDownObject;
|
||||
|
||||
/// <summary>
|
||||
/// 处理边界鼠标按下事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 如果发送者是 RandomDrawPanel 或 SingleDrawPanel,且它们被隐藏,则不处理事件
|
||||
/// 否则存储当前鼠标按下的对象
|
||||
/// </remarks>
|
||||
private void Border_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
// 如果发送者是 RandomDrawPanel 或 SingleDrawPanel,且它们被隐藏,则不处理事件
|
||||
@@ -34,7 +46,15 @@ namespace Ink_Canvas
|
||||
lastBorderMouseDownObject = sender;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 处理墨迹选择克隆鼠标释放事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 只有当鼠标按下和释放的是同一个对象时才处理
|
||||
/// 执行墨迹克隆操作并记录日志
|
||||
/// </remarks>
|
||||
private void BorderStrokeSelectionClone_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (lastBorderMouseDownObject != sender) return;
|
||||
@@ -55,6 +75,15 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理墨迹选择克隆到新画板鼠标释放事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 只有当鼠标按下和释放的是同一个对象时才处理
|
||||
/// 克隆选中的墨迹到新画板并清除当前选择
|
||||
/// </remarks>
|
||||
private void BorderStrokeSelectionCloneToNewBoard_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (lastBorderMouseDownObject != sender) return;
|
||||
@@ -64,24 +93,60 @@ namespace Ink_Canvas
|
||||
CloneStrokesToNewBoard(strokes);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理墨迹选择删除鼠标释放事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 只有当鼠标按下和释放的是同一个对象时才处理
|
||||
/// 调用 SymbolIconDelete_MouseUp 方法执行删除操作
|
||||
/// </remarks>
|
||||
private void BorderStrokeSelectionDelete_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (lastBorderMouseDownObject != sender) return;
|
||||
SymbolIconDelete_MouseUp(sender, e);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理笔宽减小鼠标释放事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 只有当鼠标按下和释放的是同一个对象时才处理
|
||||
/// 调用 ChangeStrokeThickness 方法减小笔宽
|
||||
/// </remarks>
|
||||
private void GridPenWidthDecrease_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (lastBorderMouseDownObject != sender) return;
|
||||
ChangeStrokeThickness(0.8);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理笔宽增大鼠标释放事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 只有当鼠标按下和释放的是同一个对象时才处理
|
||||
/// 调用 ChangeStrokeThickness 方法增大笔宽
|
||||
/// </remarks>
|
||||
private void GridPenWidthIncrease_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (lastBorderMouseDownObject != sender) return;
|
||||
ChangeStrokeThickness(1.25);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更改选中墨迹的粗细
|
||||
/// </summary>
|
||||
/// <param name="multipler">缩放倍数</param>
|
||||
/// <remarks>
|
||||
/// 对选中的每个墨迹应用缩放倍数
|
||||
/// 确保新的粗细在允许的范围内
|
||||
/// 如果有 DrawingAttributesHistory,则提交历史记录
|
||||
/// </remarks>
|
||||
private void ChangeStrokeThickness(double multipler)
|
||||
{
|
||||
foreach (var stroke in inkCanvas.GetSelectedStrokes())
|
||||
@@ -107,6 +172,15 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理笔宽恢复默认鼠标释放事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 只有当鼠标按下和释放的是同一个对象时才处理
|
||||
/// 将选中墨迹的粗细恢复为默认值
|
||||
/// </remarks>
|
||||
private void GridPenWidthRestore_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (lastBorderMouseDownObject != sender) return;
|
||||
@@ -118,6 +192,16 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理水平翻转鼠标释放事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 只有当鼠标按下和释放的是同一个对象时才处理
|
||||
/// 对选中的墨迹应用水平翻转变换
|
||||
/// 如果有 DrawingAttributesHistory,则提交历史记录
|
||||
/// </remarks>
|
||||
private void ImageFlipHorizontal_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (lastBorderMouseDownObject != sender) return;
|
||||
@@ -155,6 +239,16 @@ namespace Ink_Canvas
|
||||
//updateBorderStrokeSelectionControlLocation();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理垂直翻转鼠标释放事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 只有当鼠标按下和释放的是同一个对象时才处理
|
||||
/// 对选中的墨迹应用垂直翻转变换
|
||||
/// 如果有 DrawingAttributesHistory,则提交历史记录
|
||||
/// </remarks>
|
||||
private void ImageFlipVertical_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (lastBorderMouseDownObject != sender) return;
|
||||
@@ -186,6 +280,16 @@ namespace Ink_Canvas
|
||||
}
|
||||
|
||||
// ... existing code ...
|
||||
/// <summary>
|
||||
/// 处理顺时针旋转45度鼠标释放事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 只有当鼠标按下和释放的是同一个对象时才处理
|
||||
/// 对选中的墨迹应用45度旋转变换
|
||||
/// 如果有 DrawingAttributesHistory,则提交历史记录
|
||||
/// </remarks>
|
||||
private void ImageRotate45_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (lastBorderMouseDownObject != sender) return;
|
||||
@@ -216,6 +320,16 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理顺时针旋转90度鼠标释放事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 只有当鼠标按下和释放的是同一个对象时才处理
|
||||
/// 对选中的墨迹应用90度旋转变换
|
||||
/// 如果有 DrawingAttributesHistory,则提交历史记录
|
||||
/// </remarks>
|
||||
private void ImageRotate90_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (lastBorderMouseDownObject != sender) return;
|
||||
@@ -254,17 +368,51 @@ namespace Ink_Canvas
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 墨迹选择覆盖层鼠标按下状态
|
||||
/// </summary>
|
||||
private bool isGridInkCanvasSelectionCoverMouseDown;
|
||||
/// <summary>
|
||||
/// 墨迹拖动状态
|
||||
/// </summary>
|
||||
private bool isStrokeDragging = false;
|
||||
/// <summary>
|
||||
/// 墨迹拖动起始点
|
||||
/// </summary>
|
||||
private Point strokeDragStartPoint;
|
||||
/// <summary>
|
||||
/// 墨迹选择克隆集合
|
||||
/// </summary>
|
||||
private StrokeCollection StrokesSelectionClone = new StrokeCollection();
|
||||
|
||||
// 选择框和选择点相关变量
|
||||
/// <summary>
|
||||
/// 调整大小状态
|
||||
/// </summary>
|
||||
private bool isResizing = false;
|
||||
/// <summary>
|
||||
/// 当前调整把手
|
||||
/// </summary>
|
||||
private string currentResizeHandle = "";
|
||||
/// <summary>
|
||||
/// 调整起始点
|
||||
/// </summary>
|
||||
private Point resizeStartPoint;
|
||||
/// <summary>
|
||||
/// 原始选择边界
|
||||
/// </summary>
|
||||
private Rect originalSelectionBounds;
|
||||
|
||||
/// <summary>
|
||||
/// 处理墨迹选择覆盖层鼠标按下事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 如果有选中的墨迹,检查点击位置是否在选择框边界内
|
||||
/// 如果在边界内,开始拖动墨迹
|
||||
/// 如果在边界外,取消选择
|
||||
/// </remarks>
|
||||
private void GridInkCanvasSelectionCover_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
isGridInkCanvasSelectionCoverMouseDown = true;
|
||||
@@ -297,6 +445,15 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理墨迹选择覆盖层鼠标移动事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标事件参数</param>
|
||||
/// <remarks>
|
||||
/// 如果正在拖动墨迹,执行拖动操作
|
||||
/// 如果鼠标在选中区域移动,更新墨迹选中栏位置
|
||||
/// </remarks>
|
||||
private void GridInkCanvasSelectionCover_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (!isGridInkCanvasSelectionCoverMouseDown) return;
|
||||
@@ -331,6 +488,15 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理墨迹选择覆盖层鼠标释放事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标按钮事件参数</param>
|
||||
/// <remarks>
|
||||
/// 结束墨迹拖动
|
||||
/// 只有在没有选中墨迹时才隐藏选中栏
|
||||
/// </remarks>
|
||||
private void GridInkCanvasSelectionCover_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (!isGridInkCanvasSelectionCoverMouseDown) return;
|
||||
@@ -352,6 +518,17 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理选择按钮点击事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">路由事件参数</param>
|
||||
/// <remarks>
|
||||
/// 如果当前是选择模式,检查是否全选
|
||||
/// 如果全选,则切换到墨迹模式再切换回选择模式
|
||||
/// 如果不是全选,则选择所有有效墨迹
|
||||
/// 如果当前不是选择模式,则切换到选择模式
|
||||
/// </remarks>
|
||||
private void BtnSelect_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
forceEraser = true;
|
||||
@@ -381,10 +558,30 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 墨迹选择控件宽度
|
||||
/// </summary>
|
||||
private double BorderStrokeSelectionControlWidth = 490.0;
|
||||
/// <summary>
|
||||
/// 墨迹选择控件高度
|
||||
/// </summary>
|
||||
private double BorderStrokeSelectionControlHeight = 80.0;
|
||||
/// <summary>
|
||||
/// 程序更改墨迹选择状态
|
||||
/// </summary>
|
||||
private bool isProgramChangeStrokeSelection;
|
||||
|
||||
/// <summary>
|
||||
/// 处理墨迹画布选择更改事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">事件参数</param>
|
||||
/// <remarks>
|
||||
/// 优先检查墨迹选择状态
|
||||
/// 如果有墨迹被选中,显示墨迹选择栏和选择框
|
||||
/// 如果有图片元素被选中,不显示选择框
|
||||
/// 如果没有选中任何内容,隐藏选择框
|
||||
/// </remarks>
|
||||
private void inkCanvas_SelectionChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (isProgramChangeStrokeSelection) return;
|
||||
@@ -438,6 +635,14 @@ namespace Ink_Canvas
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 更新墨迹选中栏位置
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 计算墨迹选中栏的位置,确保在墨迹下方显示
|
||||
/// 如果选中栏会超出屏幕底部,则显示在墨迹上方
|
||||
/// 如果上方也没有空间,则显示在顶部
|
||||
/// </remarks>
|
||||
private void updateBorderStrokeSelectionControlLocation()
|
||||
{
|
||||
var borderLeft = (inkCanvas.GetSelectionBounds().Left + inkCanvas.GetSelectionBounds().Right -
|
||||
@@ -461,11 +666,28 @@ namespace Ink_Canvas
|
||||
BorderStrokeSelectionControl.Margin = new Thickness(borderLeft, borderTop, 0, 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理墨迹选择覆盖层操作开始事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">操作开始事件参数</param>
|
||||
/// <remarks>
|
||||
/// 设置操作模式为所有模式
|
||||
/// </remarks>
|
||||
private void GridInkCanvasSelectionCover_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
|
||||
{
|
||||
e.Mode = ManipulationModes.All;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理墨迹选择覆盖层操作完成事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">操作完成事件参数</param>
|
||||
/// <remarks>
|
||||
/// 如果有 StrokeManipulationHistory,则提交历史记录
|
||||
/// 如果有 DrawingAttributesHistory,则提交历史记录
|
||||
/// </remarks>
|
||||
private void GridInkCanvasSelectionCover_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
|
||||
{
|
||||
if (StrokeManipulationHistory?.Count > 0)
|
||||
@@ -490,6 +712,17 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理选择覆盖层的操作增量事件,将来自触摸或操作的平移、缩放和旋转应用到当前选中的墨迹上并更新选择控件位置。
|
||||
/// </summary>
|
||||
/// <param name="sender">触发事件的元素(通常为选择覆盖层)。</param>
|
||||
/// <param name="e">包含平移、缩放和旋转增量的 ManipulationDeltaEventArgs。</param>
|
||||
/// <remarks>
|
||||
/// - 当只有单指触摸且已有选中墨迹时,不在此处处理拖动(由 TouchMove 处理)。
|
||||
/// - 三指及以上触摸时禁用缩放。
|
||||
/// - 若 StrokesSelectionClone 非空,则对其内的墨迹应用变换;否则在允许两指旋转时也会应用旋转变换。
|
||||
/// - 处理完成后会刷新并更新边框/选择控件的位置。
|
||||
/// </remarks>
|
||||
private void GridInkCanvasSelectionCover_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
|
||||
{
|
||||
try
|
||||
@@ -543,6 +776,11 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理选区覆盖层的触摸按下事件:记录触摸设备 ID,并在第一个触点时保存选择中心与用于拖拽的初始触点位置。
|
||||
/// </summary>
|
||||
/// <param name="sender">事件源(触摸事件的发送者)。</param>
|
||||
/// <param name="e">触摸事件参数,包含触点位置与设备 ID。</param>
|
||||
private void GridInkCanvasSelectionCover_TouchDown(object sender, TouchEventArgs e)
|
||||
{
|
||||
dec.Add(e.TouchDevice.Id);
|
||||
@@ -558,6 +796,11 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理选区覆盖层的触摸结束事件:更新触摸跟踪状态并根据触摸位置和当前选区状态显示或隐藏选区覆盖层与克隆集合。
|
||||
/// </summary>
|
||||
/// <param name="sender">触发事件的对象(通常为选区覆盖层)。</param>
|
||||
/// <param name="e">触摸事件参数,包含触点信息。</param>
|
||||
private void GridInkCanvasSelectionCover_TouchUp(object sender, TouchEventArgs e)
|
||||
{
|
||||
dec.Remove(e.TouchDevice.Id);
|
||||
@@ -597,6 +840,10 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理触摸移动事件,按单指拖动并平移当前选中的墨迹,同时更新选择控件的位置。
|
||||
/// </summary>
|
||||
/// <remarks>仅在存在选中墨迹且当前仅有一个触摸点时生效;若起始触摸点未记录(lastDragPointInCanvas 为 (0,0))则不移动。只有当触摸位移在任一方向超过 1 像素时,才对每条选中墨迹应用平移变换,并更新选择控件位置与最后触摸点。</remarks>
|
||||
private void GridInkCanvasSelectionCover_TouchMove(object sender, TouchEventArgs e)
|
||||
{
|
||||
// 处理触摸移动事件 - 用于拖动选中的墨迹
|
||||
@@ -636,6 +883,12 @@ namespace Ink_Canvas
|
||||
private Point lastTouchPointOnGridInkCanvasCover = new Point(0, 0);
|
||||
private Point lastDragPointInCanvas = new Point(0, 0);
|
||||
|
||||
/// <summary>
|
||||
/// 切换到选择(套索)工具模式并同步光标显示。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 同时取消强制橡皮擦和点式橡皮擦状态,并将绘制形状模式重置为默认(0)。
|
||||
/// </remarks>
|
||||
private void LassoSelect_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
forceEraser = false;
|
||||
@@ -646,6 +899,16 @@ namespace Ink_Canvas
|
||||
SetCursorBasedOnEditingMode(inkCanvas);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理套索选择按钮点击事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">路由事件参数</param>
|
||||
/// <remarks>
|
||||
/// 设置工具模式为选择模式
|
||||
/// 启用墨迹画布的操作支持
|
||||
/// 设置光标为选择模式光标
|
||||
/// </remarks>
|
||||
private void BtnLassoSelect_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
forceEraser = false;
|
||||
@@ -659,6 +922,17 @@ namespace Ink_Canvas
|
||||
|
||||
#region UIElement Selection and Resize
|
||||
|
||||
/// <summary>
|
||||
/// 获取UI元素的边界
|
||||
/// </summary>
|
||||
/// <param name="element">UI元素</param>
|
||||
/// <returns>UI元素的边界矩形</returns>
|
||||
/// <remarks>
|
||||
/// 如果元素是FrameworkElement,获取其位置和大小
|
||||
/// 如果元素有RenderTransform,尝试使用变换后的边界
|
||||
/// 如果变换失败,回退到简单计算
|
||||
/// 如果元素不是FrameworkElement,返回空矩形
|
||||
/// </remarks>
|
||||
private Rect GetUIElementBounds(UIElement element)
|
||||
{
|
||||
if (element is FrameworkElement fe)
|
||||
@@ -701,6 +975,12 @@ namespace Ink_Canvas
|
||||
|
||||
#region Selection Display and Resize Handles
|
||||
|
||||
/// <summary>
|
||||
/// 在画布上显示当前选中墨迹的可视选择框与调整控件(如有选中墨迹则显示,否则隐藏)。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 如果没有选中任何墨迹,隐藏选择显示;否则计算选区边界,将选择框在所有方向各扩展 8 像素,设置选择框的位置与尺寸,并更新调整句柄的位置后显示句柄画布。
|
||||
/// </remarks>
|
||||
private void UpdateSelectionDisplay()
|
||||
{
|
||||
if (inkCanvas.GetSelectedStrokes().Count == 0)
|
||||
@@ -725,12 +1005,22 @@ namespace Ink_Canvas
|
||||
SelectionHandlesCanvas.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 隐藏选择显示
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 隐藏选择矩形和选择把手画布
|
||||
/// </remarks>
|
||||
private void HideSelectionDisplay()
|
||||
{
|
||||
SelectionRectangle.Visibility = Visibility.Collapsed;
|
||||
SelectionHandlesCanvas.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据给定的选择边界定位并设置八个缩放/移动把手的位置,四个把手在各边外扩展 8 像素,四个角把手完全位于外部。
|
||||
/// </summary>
|
||||
/// <param name="bounds">当前选区在画布坐标系中的边界矩形(未包含用于显示的 8 像素外扩展)。</param>
|
||||
private void UpdateSelectionHandles(Rect bounds)
|
||||
{
|
||||
// 四个边选择点,向外扩展8像素
|
||||
@@ -746,6 +1036,14 @@ namespace Ink_Canvas
|
||||
BottomRightHandle.Margin = new Thickness(bounds.Right + 4, bounds.Bottom + 4, 0, 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 在用户按下选择框的缩放把手时开始缩放操作。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 记录缩放开始位置和当前选区的初始边界,设置当前活动把手并捕获鼠标以便后续移动/释放事件处理。
|
||||
/// </remarks>
|
||||
/// <param name="sender">触发事件的缩放把手,预期为一个 Rectangle。</param>
|
||||
/// <param name="e">包含鼠标按下事件的位置信息和处理标志的 <see cref="MouseButtonEventArgs"/> 实例。</param>
|
||||
private void SelectionHandle_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (sender is Rectangle handle)
|
||||
@@ -759,6 +1057,16 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理选择把手鼠标移动事件
|
||||
/// </summary>
|
||||
/// <param name="sender">事件发送者</param>
|
||||
/// <param name="e">鼠标事件参数</param>
|
||||
/// <remarks>
|
||||
/// 如果正在调整大小,计算新的边界
|
||||
/// 应用新的边界到选中的墨迹
|
||||
/// 更新选择框显示
|
||||
/// </remarks>
|
||||
private void SelectionHandle_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (!isResizing || !(sender is Rectangle handle)) return;
|
||||
@@ -775,6 +1083,11 @@ namespace Ink_Canvas
|
||||
UpdateSelectionDisplay();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 在选择框的大小调整句柄上释放鼠标时结束调整操作、释放句柄的鼠标捕获并将事件标记为已处理。
|
||||
/// </summary>
|
||||
/// <param name="sender">触发事件的对象,应为表示调整句柄的 <see cref="System.Windows.Shapes.Rectangle"/>。</param>
|
||||
/// <param name="e">鼠标事件参数;在处理后该事件会被标记为已处理。</param>
|
||||
private void SelectionHandle_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (sender is Rectangle handle)
|
||||
@@ -786,6 +1099,11 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 在触摸按下选择调整句柄时开始调整操作并记录初始状态(活动句柄、起始点和当前选区边界)。
|
||||
/// </summary>
|
||||
/// <param name="sender">触发事件的调整句柄(应为 Rectangle)。</param>
|
||||
/// <param name="e">触摸事件数据;方法会标记事件为已处理并使用其触点相对于 inkCanvas 的位置。</param>
|
||||
private void SelectionHandle_TouchDown(object sender, TouchEventArgs e)
|
||||
{
|
||||
if (sender is Rectangle handle)
|
||||
@@ -799,6 +1117,12 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 在触摸移动时根据拖动更新选区的边界并将其应用到当前所选的墨迹。
|
||||
/// </summary>
|
||||
/// <param name="sender">触发事件的调整句柄(应为一个 Rectangle)。</param>
|
||||
/// <param name="e">包含触摸位置和状态的事件参数。</param>
|
||||
/// <remarks>计算新的选择边界、将其应用到所选墨迹并刷新选择显示;将事件标记为已处理。</remarks>
|
||||
private void SelectionHandle_TouchMove(object sender, TouchEventArgs e)
|
||||
{
|
||||
if (!isResizing || !(sender is Rectangle handle)) return;
|
||||
@@ -818,6 +1142,11 @@ namespace Ink_Canvas
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 结束触摸对选择框调整大小的交互,重置调整状态并标记事件已处理。
|
||||
/// </summary>
|
||||
/// <param name="sender">触发事件的调整句柄(Rectangle)。</param>
|
||||
/// <param name="e">触摸事件数据;方法会将其标记为已处理。</param>
|
||||
private void SelectionHandle_TouchUp(object sender, TouchEventArgs e)
|
||||
{
|
||||
if (sender is Rectangle handle)
|
||||
@@ -828,6 +1157,13 @@ namespace Ink_Canvas
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据指定的拖动增量和所操作的调整柄,计算并返回调整后的边界矩形。
|
||||
/// </summary>
|
||||
/// <param name="originalBounds">调整前的原始边界矩形。</param>
|
||||
/// <param name="delta">从初始位置到当前拖动位置的偏移量,用于更新对应边或角的位置和尺寸。</param>
|
||||
/// <param name="handleName">被拖动的调整柄的名称,支持的值:`TopLeftHandle`、`TopRightHandle`、`BottomLeftHandle`、`BottomRightHandle`、`TopHandle`、`BottomHandle`、`LeftHandle`、`RightHandle`。</param>
|
||||
/// <returns>应用偏移并强制最小宽高限制(10×10)后的新的边界矩形。</returns>
|
||||
private Rect CalculateNewBounds(Rect originalBounds, Point delta, string handleName)
|
||||
{
|
||||
var newBounds = originalBounds;
|
||||
@@ -884,6 +1220,15 @@ namespace Ink_Canvas
|
||||
return newBounds;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 应用新的边界到选中的墨迹
|
||||
/// </summary>
|
||||
/// <param name="newBounds">新的边界矩形</param>
|
||||
/// <remarks>
|
||||
/// 计算缩放比例和平移量
|
||||
/// 创建变换矩阵
|
||||
/// 应用变换到选中的墨迹
|
||||
/// </remarks>
|
||||
private void ApplyBoundsToStrokes(Rect newBounds)
|
||||
{
|
||||
var selectedStrokes = inkCanvas.GetSelectedStrokes();
|
||||
@@ -914,4 +1259,3 @@ namespace Ink_Canvas
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user