【问题标题】:WPF InkCanvas: Draw line with DynamicRendererWPF InkCanvas:使用 DynamicRenderer 绘制线条
【发布时间】:2013-07-14 14:42:31
【问题描述】:

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

问题是,DynamicRenderer 从原点画线到笔划的每个点,我显然不希望这样,因为它使"fan" insted 的线。

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

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

【问题讨论】:

    标签: c# wpf inkcanvas


    【解决方案1】:

    这已经很晚了。为了避免在绘制笔画时出现“扇形”,请尝试以下操作:

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

    【讨论】:

    • 这应该被标记为正确答案。为我节省了很多时间。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 当我移动鼠标时,我想从第一个点(这就是它被固定的原因)画线到光标所在的位置。这有效,但它为移动路径上的每个点画线。我只想要一行:从第一个点(我单击/固定的那个点)到我移动光标时的当前位置。
    • 看看发生了什么你的 ondraw 被调用在线上的每个点所以它从你的第一个点画线到你在画布上的每个点..所以你必须将你的第一个点更新为你的当前点直到画出那条线..我给出的代码只是检查它..它会工作..您可以通过在 ondraw 方法上放置断点来检查..
    • 看来我们不了解,所以我画了个小图link。我点击(红圈)并移动鼠标(红线)。红色矩形是收集点。我想在移动鼠标时画蓝线(一次一条)。您的代码只是连接红色矩形并沿着红色矩形划线。
    • 看看我的想法..从第一点到最后一点(离开 canvas.ok 的点)你只需要一条线..
    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多