【问题标题】:Custom line drawing in WPFWPF中的自定义线条绘制
【发布时间】:2011-07-22 16:06:04
【问题描述】:

我试图通过重写控件的 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 覆盖中)不会出现。

【问题讨论】:

  • 我用 OnRender 画线并且它们出现了。您可以添加示例代码以便我查看您做错了什么吗?
  • 我已经添加了我正在使用的渲染代码。它包含在 WPF 控件中。我试过在控件中没有内容并使用画布元素。我还进行了调试,以确保对 DrawLine 的调用确实被命中了,而且它们确实被命中了。
  • 很抱歉延迟回答 - 我的摩托车熄火了。您的代码看起来非常好。你可以使用 Debug.WriteLine 来获取你试图画线的具体点吗?如果它们超出范围,则不会出现任何线条。
  • 我很确定这些值在控件的范围内,因为我只是在单击鼠标左键时使用鼠标相对于控件的位置。该控件的宽度为 800,高度为 480,所有点击都在其中注册,并在这些范围内为我提供位置。
  • 您仍然应该添加 Debug.WriteLine 调用并确保 100% 确定。这是我现在唯一能想到的——代码应该可以工作——如果没有你正在使用的数据,我无法模拟你的调用。

标签: wpf drawing 2d


【解决方案1】:

这里实际上有两个问题。首先是您的画布背景覆盖了您在 DrawingControl 上绘制的任何内容。因此,如果您将画布背景设置为透明,则可以暂时解决该问题。

第二个问题是你需要调用InvalidateVisual在你的集合中添加一个点来强制它重绘。

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

【讨论】:

  • 我已经实现了这些更改,但仍然没有乐趣。如果您想重新检查更改,我已经更新了链接。我还在 OnRender 覆盖中设置了一个断点,以确保它确实被调用了。
  • @Slade - 确保使用Rebuild All。在我这样做之前,这些更改也没有立即对我产生影响。我在 AddPoint 方法的末尾添加了 InvalidateVisual 调用。不过会检查你的更新。
  • @Slade - 这次 DrawingControl.Background 覆盖了线条。您需要手动渲染它。基本上,您正在渲染您的 UserControl,它具有一些子视觉效果以及您的内容。其中一个子视觉效果是呈现背景/边框画笔的边框。即使它在 ControlTemplate 中,它仍然出现在 DrawingControl 的顶部。
  • @Slade - 要明白我的意思,在 OnRender 中放置一个断点。当它命中时,将this 添加到监视窗口之一。然后点击右边的放大镜。然后在可视化树中向下钻取,以查看出现在 DrawingControl 渲染的任何内容之上的所有元素。
  • 这就是我的问题!背景。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2014-03-16
相关资源
最近更新 更多