Pour ce type de volume de données, je vous suggère de créer un GeometryDrawing et un StreamGeometry contenant un seul PolyLine pour chacun de vos points. Puis combinez-les tous ensemble dans un seul DrawingGroup et affichez-le en utilisant un seul DrawingVisual.
Ce serait le XAML:
<DrawingVisual Drawing="{Binding CurrentDrawing}" />
et ce serait le code pour mettre à jour 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;
...
Si vos données sont en train de changer, il peut être avantageux de créer stocker chaque objet GeometryDrawing séparément il est donc seulement nécessaire de recréer les GeometryDrawings dont les données sources ont changé.
Mise à jour
Vous mentionnez dans votre commentaire que vous devez séparément hittest chacun des éléments de données 20-50. Dans ce cas, vous voulez probablement utiliser un DrawingVisual
distinct pour chacun. Pour optimiser les performances que vous souhaitez utiliser avec 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;
}
Hi Ray Merci pour votre réponse, je vais essayer bientôt. –
J'ai besoin d'utiliser hittesting pour mettre en évidence chaque visuel. Si je les affiche en utilisant un seul DrawingVisual, je pense que ce n'est peut-être pas à faire. –
Dans ce cas, placez chaque élément de données dans son propre DrawingVisual et utilisez RenderOpen() et DrawingContext. J'ai édité ma réponse pour montrer comment cela serait fait. –