Come spostare tutti coordinata da un oggetto WPF PolyLine?
Domanda
Ho un grafico, fatto in modo dinamico con un oggetto polilinea. Produce qualcosa di interessante, ma vorrei tenere solo gli ultimi 10 coordinate e una volta abbiamo raggiungere la posizione di 10 °, ogni coordinata sarebbe poi passare a sinistra di X pixel e il nuovo valore verrà aggiunto alla fine.
Nella funzione Add della mia classe disegno che ho provato questo tipo di codice:
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
}
}
Che non funziona perché non possiamo modificare una variabile della collezione in un ciclo foreach. Qual è il modo migliore per farlo in WPF / C #?
Maggiori informazioni
posso farlo in questo modo:
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);
}
Ma mi piacerebbe un modo più pulito per farlo senza dover creare punto oggetto molto tempo.
Soluzione
Bene, il Point
è una struttura, in modo che il sovraccarico di crearne di nuovi, non dovrebbe essere male. Facendo il seguente ...
Point p = this.myPolyline.Points[i];
p.X -= 50;
this.myPolyline.Points[i] = p;
... sarebbe davvero diverso, semplicemente perché le strutture sono passati in giro per valore.
Si sono praticamente bloccato con un ciclo for
e riassegnazione a myPolyline.Points[i]
, considerando le circostanze:
- È necessario modificare la
Point
con un valoreX
diverso. - Non è possibile modificare la variabile di un ciclo
foreach
, quindi bisogna usare un ciclofor
. -
myPolyline.Points[i].X -= 50
non funziona a causa del modo structPoint
viene recuperato dalla matrice e quindi non ri-assegnato automaticamente.
Se semplicemente si voleva spostare l'intera PolyLine
, avrei suggerito un LayoutTransform
o RenderTransform
, ma si sta spostando un sottoinsieme di Point
s e poi aggiungerà altri.
Modifica Se si vuole veramente di refactoring che il funzionamento, è possibile creare un metodo di estensione sul PointCollection
per il ciclo for
e il punto di messa a punto in questo modo:
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.
}
}
Utilizzo:
myPolyline.Points.ChangePoints( new Vector( -50, 0 ) );
Hai ancora cambiare le Point
s nello stesso modo, ma è riscritta altrove in modo che l'utilizzo è più leggibile. E l'utilizzo di Vector
rende più leggibile, anche.
Altri suggerimenti
Spostare l'intera area sinistra invece e aumentare l'insertionpoint per i nuovi punti per tutto il tempo.
Se si dispone di tonnellate di articoli questo migliorerà anche le prestazioni di rendering (soprattutto se si anima il movimento).