Wie bewege ich die gesamte Koordinate von einem WPF -Polyline -Objekt?
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.
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:
- Sie müssen die ändern
Point
mit einem anderenX
Wert. - Sie können die Variable von a nicht ändern
foreach
Schleife, also musst du a verwendenfor
Schleife. myPolyline.Points[i].X -= 50
wird nicht funktionieren, weil die Art und Weise wie diePoint
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 Point
s 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 Point
Auf 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).