我创建了一个使用StreamGeometry绘制ObservableCollection'Point的自定义形状。当信号超过画布的宽度时,它会被拉开,它会缠绕到开头。使用两条polyLines;一个从画布的开头到最后一个添加的点,一个从当前集合中的第一个添加点到画布的结尾:
protected override Geometry DefiningGeometry
{
get
{
if (this.Points == null || !this.Points.Any())
{
return Geometry.Empty;
}
var firstGeometryPoints = this.Points.Where(p => p.Point.X >= this.Points.First().Point.X);
var secondGeometryPoints = this.Points.Except(firstGeometryPoints);
var geometry = new StreamGeometry();
using (var context = geometry.Open())
{
context.BeginFigure(firstGeometryPoints.First().Point, true, false);
context.PolyLineTo(firstGeometryPoints.Skip(1).Select(x => x.Point).ToArray(), true, true);
if (secondGeometryPoints.Any())
{
context.BeginFigure(secondGeometryPoints.First().Point, true, false);
context.PolyLineTo(secondGeometryPoints.Skip(1).Select(x => x.Point).ToArray(), true, true);
}
geometry.Freeze();
}
return geometry;
}
}
每当Points集合更改时,我都会使用InvalidateVisual()来强制重绘形状。但由于数据点以每秒500个样本的速度添加,因此应用程序开始滞后。是否有另一种方法可以创建这种类型的图形而无需在每个样本上重新绘制整个形状?