Для такого типа данных я бы предложил вам построить GeometryDrawing и StreamGeometry, содержащие по одной PolyLine для каждой из ваших точек. Затем объедините их все вместе в одной 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;
}