我试图通过覆盖控件的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覆盖中)。
答案 0 :(得分:2)
这里实际上有两个问题。首先是你的Canvas的背景掩盖你在DrawingControl上绘制的任何东西。因此,如果将“画布背景”设置为“透明”,则可以暂时解决该问题。
第二个问题是,您需要在向集合中添加一个点以强制重绘后调用InvalidateVisual。
您可能需要添加另一个显示在“画布”顶部的控件,并在那里渲染线条。或者您需要在DrawingControl.OnRender方法中自己渲染背景。