Comment déplacer toutes les coordonnées d'un objet PolyLine WPF?
Question
J'ai un graphique fait dynamiquement avec un objet polyligne. Elle produit quelque chose d'intéressant, mais je voudrais ne conserver que les 10 dernières coordonnées et une fois que nous avons atteindre la 10ème position, tous les coordonnées se déplacerait vers la gauche par pixel X et la nouvelle valeur sera ajoutée à la fin.
Dans la fonction Ajouter de ma classe de dessin j'ai essayé ce genre de code:
if (points.Count > 10)
{
myPolyline.Points.RemoveAt(0);
foreach(Point p in myPolyline.Points)
{
p.X = p.X - 50;//Move all coord back to have a place for the new one
}
}
Cela ne fonctionne pas parce que nous ne pouvons pas modifier une variable de la collection dans une boucle foreach. Quelle est la meilleure façon de le faire dans WPF / C #?
Plus d'infos
Je peux le faire en faisant ceci:
for (int i = 0; i < this.myPolyline.Points.Count; i++)
{
this.myPolyline.Points[i] = new Point(this.myPolyline.Points[i].X - 50, this.myPolyline.Points[i].Y);
}
Mais je voudrais un moyen plus propre de le faire sans avoir à créer un point objet temps très.
La solution
Eh bien, la Point
est un struct, de sorte que les frais généraux de la création de nouvelles ne devrait pas être mauvais. Faire ce qui suit ...
Point p = this.myPolyline.Points[i];
p.X -= 50;
this.myPolyline.Points[i] = p;
... serait vraiment pas différent, tout simplement parce que struct sont passés autour de la valeur.
Vous êtes un peu coincé avec une boucle de for
et réaffectant à myPolyline.Points[i]
, compte tenu des circonstances:
- Vous devez modifier le
Point
avec une autre valeurX
. - Vous ne pouvez pas modifier la variable d'une boucle de
foreach
, vous devez donc utiliser une boucle defor
. -
myPolyline.Points[i].X -= 50
ne fonctionnera pas à cause de la façon dont le structPoint
est récupéré à partir du tableau et puis ne pas réaffecté automatiquement.
Si vous vouliez simplement déplacer l'ensemble PolyLine
, j'aurais suggéré un LayoutTransform
ou RenderTransform
, mais vous vous déplacez un sous-ensemble de Point
s et ajoutera d'autres.
Modifier Si vous voulez vraiment factoriser cette opération, vous pouvez créer une méthode d'extension sur PointCollection
pour la boucle de for
et peaufinage point comme ceci:
static public void ChangePoints( this PointCollection pc, Vector v ) {
for (int i = 0; i < pc.Count; i++ ) {
pc[i] += v;
// the above works on the indexer because you're doing an operation on the
// Point rather than on one of the Point's members.
}
}
Utilisation:
myPolyline.Points.ChangePoints( new Vector( -50, 0 ) );
Il vous reste à changer les Point
s de la même manière, mais il est refactorisé ailleurs pour que l'utilisation est plus lisible. Et l'utilisation de Vector
le rend plus lisible aussi.
Autres conseils
Déplacer toute la toile à gauche au lieu et d'augmenter le PointInsertion pour les nouveaux points tout le temps.
Si vous avez des tonnes d'articles ce sera aussi améliorer les performances de rendu (surtout si vous animez le mouvement).