繁体   English   中英

WPF InkCanvas:使用DynamicRenderer绘制线条

[英]WPF InkCanvas: Draw line with DynamicRenderer

我正在使用InkCanvas在WPF中编写基本的图形编辑器。 我做了一些自定义形状(继承自Stroke)。 当我在InkCanvas上画线wen时,我要先画最后一条线。 效果很好,但是现在我不喜欢默认的“笔触”,所以我决定重写DynamicRenderer以实时渲染线。

问题是,DynamicRenderer从原点到笔划的每个点都画线,而我显然不希望那样做,因为这会使“ fan”迷住了线条。

有我的自定义代码,如果可能,我正在寻找仅从原点到最后一点画线的解决方案。

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);
    }
}

这太迟了。 为了避免在绘制笔划时出现“扇形”,请尝试以下操作:

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提供了一个简单的标志来停止循环。

我认为在您的ondraw函数中,您的第一点是固定的,因此始终将其作为原点,以便可以尝试进行连续绘制。

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

如果遇到相同的点异常,它将更新您的第一点(或者可以将新的点名称定义为先前的点,并使其最初与第一点相等,然后像我对第一点所做的那样在ondraw方法中将其更新。 。

如果要从第一点到最后一点的直线,可以在从onstylusup方法获得最后一点后在draw方法上调用您。希望这对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM