2

InkCanvas を使用して WPF で基本的なグラフィック エディターを作成しています。いくつかのカスタム シェイプを作成しました (Stroke から継承)。InkCanvas で線を引くときは、最初と最後の点を取って線を引きます。それはうまくいきますが、デフォルトの「ペンストローク」が気に入らないので、リアルタイムで線をレンダリングするように DynamicRenderer を書き直すことにしました。

問題は、DynamicRenderer が原点からストロークのすべての点まで線を描画することです。線の代わりに「ファン」が作成されるため、明らかにそれは望ましくありません。

私のカスタムコードがあり、可能であれば、原点から最後の点まで線を引くための解決策を探しています。

class LineRenderer : DynamicRenderer
{
    private Point firstPoint;
    private Pen pen = new Pen(new SolidColorBrush(Colors.Gray),1);

    public LineRenderer()
    {
        firstPoint = new Point(double.PositiveInfinity, double.PositiveInfinity);
    }

    protected override void OnStylusDown(RawStylusInput rawStylusInput)
    {
        firstPoint = new Point(rawStylusInput.GetStylusPoints().First().ToPoint().X, rawStylusInput.GetStylusPoints().First().ToPoint().Y);
        base.OnStylusDown(rawStylusInput);
    }

    protected override void OnDraw(DrawingContext drawingContext,
                                   StylusPointCollection stylusPoints,
                                   Geometry geometry, Brush fillBrush)
    {
        drawingContext.DrawLine(pen, firstPoint, stylusPoints.First().ToPoint());
    }

    protected override void OnStylusUp(RawStylusInput rawStylusInput)
    {
        firstPoint = new Point(double.PositiveInfinity, double.PositiveInfinity);
        base.OnStylusUp(rawStylusInput);
    }
}
4

2 に答える 2

2

これは非常に遅いです。ストロークが描かれている間に「ファン」を避けるために、これを試してください:

protected override void OnDraw(DrawingContext drawingContext,
                               StylusPointCollection stylusPoints,
                               Geometry geometry, Brush fillBrush)
        {
            if (!_isManipulating)
            {
                _isManipulating = true;
                StylusDevice currentStylus = Stylus.CurrentStylusDevice;
                this.Reset(currentStylus, stylusPoints);
            }
            _isManipulating = false;

            var pen = new Pen(brush, 2);
            drawingContext.DrawLine(pen, startPoint,stylusPoints.First().ToPoint());
       }


protected override void OnStylusDown(RawStylusInput rawStylusInput)
        {
            StylusPointCollection y = rawStylusInput.GetStylusPoints();
            startPoint = (Point)y.First();

            // Allocate memory to store the previous point to draw from.
            prevPoint = new Point(double.NegativeInfinity, double.NegativeInfinity);
            base.OnStylusDown(rawStylusInput);
        }

ここでの秘訣は、DynamicRenderer.Resetを使用することです。

現在のストロークのレンダリングをクリアし、再描画します。

再描画は OnDraw メソッドに再び入るため、_isManipulating はループを停止するための単純なフラグを提供します。

于 2018-02-18T03:02:29.100 に答える