improve:实时笔锋

This commit is contained in:
2026-04-30 14:25:32 +08:00
parent 8b53456b5d
commit 988af60a30
5 changed files with 229 additions and 15 deletions
+63 -1
View File
@@ -2489,6 +2489,7 @@ namespace Ink_Canvas
/// 用于标识鼠标是否处于按下状态,在绘制过程中使用
/// </remarks>
private bool isMouseDown;
private bool _isMouseRealtimeInking;
/// <summary>
/// 触摸按下状态标志
@@ -2512,6 +2513,17 @@ namespace Ink_Canvas
/// </remarks>
private void inkCanvas_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left && ShouldUseRealtimeVelocityBrushTip() && drawingShapeMode == 0)
{
_isMouseRealtimeInking = true;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
var p = e.GetPosition(inkCanvas);
InitializeRealtimeBrushTipStateFromPoint(MouseRealtimeStrokeId, p);
var sv = GetStrokeVisual(MouseRealtimeStrokeId);
TryAppendRealtimeVelocityBrushTipPoint(sv, MouseRealtimeStrokeId, p);
sv.ForceRedraw();
}
inkCanvas.CaptureMouse();
ViewboxFloatingBar.IsHitTestVisible = false;
BlackboardUIGridForInkReplay.IsHitTestVisible = false;
@@ -2532,7 +2544,24 @@ namespace Ink_Canvas
/// </remarks>
private void inkCanvas_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown) MouseTouchMove(e.GetPosition(inkCanvas));
if (_isMouseRealtimeInking && isMouseDown)
{
var sv = GetStrokeVisual(MouseRealtimeStrokeId);
var handled = TryAppendRealtimeVelocityBrushTipPoint(sv, MouseRealtimeStrokeId, e.GetPosition(inkCanvas));
if (handled)
{
sv.ForceRedraw();
}
else
{
_isMouseRealtimeInking = false;
MouseTouchMove(e.GetPosition(inkCanvas));
}
}
else if (isMouseDown)
{
MouseTouchMove(e.GetPosition(inkCanvas));
}
if (Settings.Canvas.IsShowCursor)
{
@@ -2560,6 +2589,39 @@ namespace Ink_Canvas
/// </remarks>
private void inkCanvas_MouseUp(object sender, MouseButtonEventArgs e)
{
if (_isMouseRealtimeInking)
{
try
{
var sv = GetStrokeVisual(MouseRealtimeStrokeId);
sv?.ForceRedraw();
var stroke = sv?.Stroke;
if (stroke != null)
{
if (stroke.DrawingAttributes != null) stroke.DrawingAttributes.IgnorePressure = false;
if (!stroke.ContainsPropertyData(RealtimeVelocityBrushTipAppliedGuid))
stroke.AddPropertyData(RealtimeVelocityBrushTipAppliedGuid, true);
inkCanvas.Strokes.Add(stroke);
inkCanvas_StrokeCollected(inkCanvas, new InkCanvasStrokeCollectedEventArgs(stroke));
}
if (VisualCanvasList.TryGetValue(MouseRealtimeStrokeId, out var visualCanvas) && inkCanvas.Children.Contains(visualCanvas))
inkCanvas.Children.Remove(visualCanvas);
StrokeVisualList.Remove(MouseRealtimeStrokeId);
VisualCanvasList.Remove(MouseRealtimeStrokeId);
TouchDownPointsList.Remove(MouseRealtimeStrokeId);
CleanupRealtimeBrushTipState(MouseRealtimeStrokeId);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex);
}
finally
{
_isMouseRealtimeInking = false;
}
}
HandleEraserOperationEnded();
inkCanvas.ReleaseMouseCapture();
ViewboxFloatingBar.IsHitTestVisible = true;