WPF InkCanvas:使用DynamicRenderer绘制线条

时间:2013-07-16 12:11:02

标签: c# wpf inkcanvas

我正在使用InkCanvas在WPF中编写基本的图形编辑器。我做了一些自定义形状(继承自Stroke)。当我在InkCanvas上绘制线条时,我会先取点和最后一点然后划一条线。这工作正常,但现在我不喜欢默认的“笔划”,所以我决定重写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);
    }
}

2 个答案:

答案 0 :(得分:1)

这已经很晚了。为了避免"粉丝"在绘制笔划的同时,试试这个:

const config = {
  prefix: 'MYAPP',
  MYAPP_HOST: '1',
  MYAPP_HOST: '2',
  [ this.prefix + '_HOST' ]: 'localhost',
}

这里的诀窍是使用https://firebase.google.com/docs/firestore/security/rules-conditions,其中:

  

清除当前笔划的渲染并重新绘制。

重绘将重新输入OnDraw方法,因此_isManipulating提供了一个简单的标志来停止循环。

答案 1 :(得分:-1)

我认为你的提取功能你的第一点是固定的所以它总是把它作为原点,所以你可以尝试这个连续绘图。

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方法调用你..希望这对你有帮助..