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.

È stato utile?

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:

  1. È necessario modificare la Point con un valore X diverso.
  2. Non è possibile modificare la variabile di un ciclo foreach, quindi bisogna usare un ciclo for.
  3. myPolyline.Points[i].X -= 50 non funziona a causa del modo struct Point 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 Points 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 Points 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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top