我正在使用从Canvas派生的WPF控件,我正在绘制一个几何选择,通过一个沿着这些线工作的过程,但是要复杂得多,所以虽然这说明了这个过程,但它更接近伪-code:
public class LineView: Canvas
{
private List<GeometryLine> lines;
public LineView()
{
lines = new List<GeometryLine>();
}
private PathFigure GetPathFigure(List<Point> line, bool close)
{
var size = line.Count;
var points = new PathSegmentCollection(size);
var first = line.First();
for (int i = 1; i < size; i++)
{
points.Add(new LineSegment(line[i], true));
}
var figure = new PathFigure(first, points, close);
return new PathGeometry(new List<PathFigure>(figure));
}
public DrawingGroup DrawLine(GeometryLine line)
{
var geometry = new GeometryGroup();
geometry.Children.Add(GetPathGeometry(line.Points, false));
var d = new GeometryDrawing();
d.Pen = GetPen();
d.Geometry = geometry;
DrawingGroup group = new DrawingGroup();
group.Append();
group.Children.Add(d);
return group;
}
public override void OnRender(DrawingContext drw)
{
if ( 0 < lines.Count )
{
foreach ( var line in lines )
{
drw.DrawDrawing(DrawLine(line));
}
}
}
public void SetLines(List<GeometryLine> newLines)
{
lines = newLines;
this.InvalidateVisual();
}
}
这一切都可以在画布上渲染几何内容。但是,当数据发生变化并且使用一组新数据调用SetLines
时,它并不总是清除画布 - 有时它会在旧集合上绘制新的行集,有时它会清除帆布。我看不到任何关于它什么时候画出的图案而不是它清除画布时的图案。
如果我从InvalidateVisual
方法调用Render
,它将可靠地清空画布,但它也会强制再次渲染上下文。过去关于此主题的问题表明,this.Children.Clear()
或InvalidateVisual
是推荐的策略,但它们都不能防止这种透支问题。当我查看Children
集合时,它总是空的。
我需要做些什么才能确保它清除以前的几何图形,然后每次更改时绘制更新的几何图形?