【发布时间】: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% 确定。这是我现在唯一能想到的——代码应该可以工作——如果没有你正在使用的数据,我无法模拟你的调用。