对于这种数据量,我建议您为每个点构建一个包含单个折线的 GeometryDrawing 和 StreamGeometry。然后将它们全部组合在一个 DrawingGroup 中,并使用单个 DrawingVisual 显示它。
这将是 XAML:
<DrawingVisual Drawing="{Binding CurrentDrawing}" />
这将是更新 CurrentDrawing 的代码:
var group = new DrawingGroup();
foreach(var data in myData)
{
StreamGeometry geo = new StreamGeometry();
using(geoContext = geo.Open())
{
geoContext.BeginFigure(myData.StartPoint, false, false);
geoContext.PolyLineTo(myData.AdditionalPoints, true, false);
}
group.Add(new GeometryDrawing
{
Geometry = geo,
Pen = myData.Pen,
});
}
CurrentDrawing = group;
...
如果您的数据正在发生变化,最好分别创建存储每个 GeometryDrawing 对象,因此只需重新创建源数据已更改的那些 GeometryDrawings。
更新
您在评论中提到您需要分别对 20-50 个数据项中的每一个进行命中测试。在这种情况下,您可能确实想为每个使用单独的DrawingVisual。为了获得最佳性能,您需要将RenderOpen() 与DrawingContext 一起使用:
IEnumerable<Visual> BuildVisuals()
{
return
from var data in myData
select BuildVisualForData(data);
}
void BuildVisualForData(MyDataType data)
{
var geo = new StreamGeometry();
using(geoContext = geo.Open())
{
geoContext.BeginFigure(myData.StartPoint, false, false);
geoContext.PolyLineTo(myData.AdditionalPoints, true, false);
}
var visual = new DrawingVisual();
using(drawingContext = visual.RenderOpen())
{
drawingContext.DrawGeometry(null, myData.Pen, geo);
}
return visual;
}