Cómo mover todas las coordenadas de un WPF objeto de Polilínea?
Pregunta
Tengo un gráfico dinámicamente con un objeto de polilínea.Se produce algo muy interesante, pero me gustaría mantener sólo el pasado 10 de coordenadas y una vez que hemos de llegar a la 10ª posición, cada coordenada se moverán a la izquierda de X píxeles y el nuevo valor se añade al final.
En el Complemento de la función de mi clase de dibujo he probado este tipo de código:
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
}
}
Eso no funciona porque no podemos modificar una variable de la colección en un bucle ForEach.¿Cuál es la mejor manera de hacer esto en WPF/C#?
Más info
Que puedo hacer por hacer esto:
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);
}
Pero me gustaría más limpia de hacerlo sin tener que crear un punto objeto de mucho tiempo.
Solución
Así, la Point
es una estructura, por lo que la sobrecarga de la creación de otros nuevos no debería ser malo.Realizando las siguientes...
Point p = this.myPolyline.Points[i];
p.X -= 50;
this.myPolyline.Points[i] = p;
...realmente no es diferente, simplemente porque sus estructuras son pasados por valor.
Está bastante atascado con un for
bucle y reasignando a myPolyline.Points[i]
, teniendo en cuenta las circunstancias:
- Tienes que modificar el
Point
con una diferenteX
valor. - Usted no puede modificar la variable de un
foreach
bucle, así que hay que utilizar unafor
loop. myPolyline.Points[i].X -= 50
no funciona debido a la forma en laPoint
struct es obtenido de la matriz y, a continuación, no re-asignado automáticamente.
Si usted simplemente quería mover toda la PolyLine
, Yo mismo podría haber sugerido un LayoutTransform
o RenderTransform
, pero va a mover un subconjunto de Point
s y, a continuación, añadir los demás.
Editar: Si usted realmente desea para refactorizar que la operación, que podría crear un método de extensión en PointCollection
para el for
bucle y el punto de retorcer como este:
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.
}
}
Uso:
myPolyline.Points.ChangePoints( new Vector( -50, 0 ) );
Usted todavía tiene que cambiar el Point
s de la misma manera, pero es refactorizar otras regiones, por lo que su uso es más legible.Y el uso de Vector
hace más legible, también.
Otros consejos
Mover todo el lienzo izquierda en lugar y aumentar la insertionpoint para los nuevos puntos todo el tiempo.
Si usted tiene toneladas de artículos esto también mejorará el rendimiento de la representación (sobre todo si se anima el movimiento).