Frage

Ich habe eine Grafik, die dynamisch mit einem Polyline -Objekt hergestellt wurde. Es produziert etwas Interessantes, aber ich möchte nur die letzten 10 Koordinaten behalten, und sobald wir die 10. Position erreicht haben, würde jede Koordinate nach x Pixel nach links bewegen und der neue Wert wird am Ende hinzugefügt.

In der Funktion hinzufügen meiner Zeichenklasse habe ich diese Art von Code ausprobiert:

        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
            }   
        }

Das funktioniert nicht, da wir eine Variable der Sammlung in einer Foreach -Schleife nicht ändern können. Was ist der beste Weg, dies in WPF/C#zu tun?

Mehr Info

Ich kann es tun, indem ich das mache:

            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);
            }

Aber ich möchte einen saubereren Weg, um es zu tun, ohne sehr Zeit ein Punktobjekt erstellen zu müssen.

War es hilfreich?

Lösung

Also, die Point ist eine Struktur, also sollte der Overhead, neue zu erstellen, nicht schlecht sein. Folgendes machen ...

Point p = this.myPolyline.Points[i];
p.X -= 50;
this.myPolyline.Points[i] = p;

... wäre wirklich nicht anders, einfach weil Strukturen nach Wert weitergegeben werden.

Du steckst so ziemlich mit einem fest for Schleife und Neuzuweisung an myPolyline.Points[i], unter Berücksichtigung der Umstände:

  1. Sie müssen die ändern Point mit einem anderen X Wert.
  2. Sie können die Variable von a nicht ändern foreach Schleife, also musst du a verwenden for Schleife.
  3. myPolyline.Points[i].X -= 50 wird nicht funktionieren, weil die Art und Weise wie die Point Struktur wird aus dem Array abgerufen und dann nicht automatisch neu zugewiesen.

Wenn Sie einfach das Ganze bewegen wollten PolyLine, Hätte ich vielleicht vorgeschlagen a LayoutTransform oder RenderTransform, aber Sie bewegen eine Teilmenge von Points und wird dann andere hinzufügen.

Bearbeiten: Wenn Sie diesen Vorgang wirklich umarbeiten möchten, können Sie eine Erweiterungsmethode erstellen PointCollection für die for Schleife und Punkte wie diese:

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.
    }
}

Verwendungszweck:

myPolyline.Points.ChangePoints( new Vector( -50, 0 ) );

Sie müssen die noch ändern PointAuf die gleiche Weise, aber es wird anderswo neu gestaltet, damit die Verwendung lesbarer ist. Und Verwendung von Vector macht es auch lesbarer.

Andere Tipps

Bewegen Sie stattdessen die gesamte Leinwand und erhöhen Sie den InsertionPoint für die neuen Punkte ständig.

Wenn Sie Tonnen von Gegenständen haben, verbessert dies auch die Rendering -Leistung (insbesondere wenn Sie die Bewegung animieren).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top