WPF中的自定义线条图

时间:2011-07-22 16:06:05

标签: wpf drawing 2d

我试图通过覆盖控件的OnRender方法并在给定的DrawingContext上调用DrawLine方法来手动在WPF中绘制一条线。我在某处读到这个方法调用不会立即绘制线条,但我无法弄清楚如何实际导致线条出现。

我尝试过使用PathGeometry,LineSegments,Line和Polyline控件的组合。我可以画出我想要的东西,但偏移量不是很正确(即绘制线条时很好,绘制折线时,所有内容都会错误地偏移)。

对此的任何建议都会很棒。

修改

笔代码

    private static readonly Pen LinePen = new Pen(new SolidColorBrush(Colors.Green), 3.0d);
    private static readonly Pen WayPointPen = new Pen(new SolidColorBrush(Colors.Gray), 3.0d);

渲染代码

    protected override void OnRender(DrawingContext drawingContext)
    {
        // Draw way points
        this.DrawWayPoints(drawingContext);

        if (mDrawing)
        {
            // Draw current line
            this.DrawCurrentLine(drawingContext);
        }
    }

    private void DrawCurrentLine(DrawingContext context)
    {
        if(mStartPoint.HasValue && mEndPoint.HasValue)
        {
            // Draw the line
            context.DrawLine(LinePen, mStartPoint.Value, mEndPoint.Value);
        }
    }

    private void DrawWayPoints(DrawingContext context)
    {
        if (mWayPoints.Count < 2)
        {
            return;
        }

        // Draw all points
        for (int i = 0; i < mWayPoints.Count - 1; i++)
        {
            var start = mWayPoints[i];
            var end = mWayPoints[i + 1];

            // Draw the line
            context.DrawLine(WayPointPen, start, end);
        }
    }

修改

测试项目:http://dl.dropbox.com/u/12763956/DrawingTest.zip (用Visual Studio 2010编写的测试项目)

使用方法:   - 在凸起区域内单击鼠标左键以将点添加到列表中。   - 右键单击​​以结束绘图和清除点。

注意:不显示自定义绘制的线条(在OnRender覆盖中)。

1 个答案:

答案 0 :(得分:2)

这里实际上有两个问题。首先是你的Canvas的背景掩盖你在DrawingControl上绘制的任何东西。因此,如果将“画布背景”设置为“透明”,则可以暂时解决该问题。

第二个问题是,您需要在向集合中添加一个点以强制重绘后调用InvalidateVisual

您可能需要添加另一个显示在“画布”顶部的控件,并在那里渲染线条。或者您需要在DrawingControl.OnRender方法中自己渲染背景。