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 回答
-1

我认为在你的 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 方法..希望这可能对你有所帮助..

于 2013-07-16T12:21:48.317 回答