c# wpf inkcanvas 模拟笔锋

  1. 通过自定义变换,使用此方法画笔擦除模式为EraseByPoint时无法按点擦除(可以考虑第二种方案)
<InkCanvas x:Name="inkCanvas" Background="White" >
    <InkCanvas.DefaultDrawingAttributes>
        <!--<DrawingAttributes StylusTip="Ellipse" Height="8" Width="4" IgnorePressure="False" FitToCurve="True" >
            --><!--
            <DrawingAttributes.StylusTipTransform>
                <Matrix M11="1" M12="1.5" M21="2.2" M22="1"/>
            </DrawingAttributes.StylusTipTransform>
        </DrawingAttributes>-->
        <DrawingAttributes StylusTip="Ellipse" Height="10" Width="10" IgnorePressure="False"
                           FitToCurve="False">
            <DrawingAttributes.StylusTipTransform>
                <Matrix M11="1" M12="1.5" M21="2.2" M22="1"></Matrix>
            </DrawingAttributes.StylusTipTransform>
        </DrawingAttributes>
    </InkCanvas.DefaultDrawingAttributes>
</InkCanvas>
  1. 重写inkcanvas收集笔迹的逻辑(也可以直接绑定OnStrokeCollected而不是重写inkcanvas)
 public class ClearCanvas : InkCanvas
 {
     protected override void OnStrokeCollected(InkCanvasStrokeCollectedEventArgs e)
     {
         var customStroke = e.Stroke;
         try
         {
             var stylusPoints = new StylusPointCollection();
             var n = customStroke.StylusPoints.Count - 1;
             var pressure = 0.1;
             var x = 10;
             if (n == 1) return;
             if (n >= x)
             {
                 for (var i = 0; i < n - x; i++)
                 {
                     var point = new StylusPoint();

                     point.PressureFactor = (float)0.5;
                     point.X = customStroke.StylusPoints[i].X;
                     point.Y = customStroke.StylusPoints[i].Y;
                     stylusPoints.Add(point);
                 }

                 for (var i = n - x; i <= n; i++)
                 {
                     var point = new StylusPoint();

                     point.PressureFactor = (float)((0.5 - pressure) * (n - i) / x + pressure);
                     point.X = customStroke.StylusPoints[i].X;
                     point.Y = customStroke.StylusPoints[i].Y;
                     stylusPoints.Add(point);
                 }
             }
             else
             {
                 for (var i = 0; i <= n; i++)
                 {
                     var point = new StylusPoint();

                     point.PressureFactor = (float)(0.4 * (n - i) / n + pressure);
                     point.X = customStroke.StylusPoints[i].X;
                     point.Y = customStroke.StylusPoints[i].Y;
                     stylusPoints.Add(point);
                 }
             }

             customStroke.StylusPoints = stylusPoints;
         }
         catch { }

         InkCanvasStrokeCollectedEventArgs args =
             new InkCanvasStrokeCollectedEventArgs(customStroke);

         //直接在StrokeCollected事件中处理时记得删除这一行
         base.OnStrokeCollected(args);
     }
 }
posted @ 2025-02-25 23:02  Hey,Coder!  阅读(41)  评论(0)    收藏  举报