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.

¿Fue útil?

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:

  1. Tienes que modificar el Point con una diferente X valor.
  2. Usted no puede modificar la variable de un foreach bucle, así que hay que utilizar una for loop.
  3. myPolyline.Points[i].X -= 50 no funciona debido a la forma en la Point 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 Points 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 Points 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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top