WPFポリラインオブジェクトからすべての座標を移動する方法は?
質問
ポリラインオブジェクトで動的に作られたグラフィックがあります。興味深いものが生成されますが、最後の10の座標のみを維持したいと思います。10番目の位置に到達したら、すべての座標がXピクセルによって左に移動し、最後に新しい値が追加されます。
描画クラスの追加関数で、私はこの種のコードを試しました:
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
}
}
foreachループでコレクションの変数を変更できないため、それはうまくいきません。 WPF/C#でこれを行うための最良の方法は何ですか?
より詳しい情報
私はこれをすることでそれをすることができます:
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);
}
しかし、ポイントオブジェクトを非常に時間を作成することなく、よりクリーンな方法を行う方法が必要です。
解決
さて、 Point
構造体なので、新しいものを作成するオーバーヘッドは悪くないはずです。次のことをしています...
Point p = this.myPolyline.Points[i];
p.X -= 50;
this.myPolyline.Points[i] = p;
...単に構造体が価値によって渡されるという理由だけで、本当に違いはありません。
あなたはかなりにとどまっています for
ループと再割り当て myPolyline.Points[i]
, 、状況を考慮して:
- 変更する必要があります
Point
別のものでX
価値。 - aの変数を変更することはできません
foreach
ループして、aを使用する必要がありますfor
ループ。 myPolyline.Points[i].X -= 50
方法のために機能しませんPoint
構造体は配列から取得され、自動的に再割り当てされません。
単に全体を移動したい場合 PolyLine
, 、私は提案したかもしれません LayoutTransform
また RenderTransform
, 、しかし、あなたはのサブセットを動かしています Point
sしてから、他の人を追加します。
編集: 本当にその操作をリファクタリングしたい場合は、拡張メソッドを作成できます PointCollection
のために for
このようにループとポイントの微調整:
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.
}
}
使用法:
myPolyline.Points.ChangePoints( new Vector( -50, 0 ) );
まだ変更する必要があります Point
同じ方法でsですが、使用状況がより読みやすくなるように他の場所にリファクタリングされます。の使用 Vector
読みやすくします。
他のヒント
代わりにキャンバス全体を左に移動し、常に新しいポイントの挿入ポイントを増やします。
たくさんのアイテムがある場合、これはレンダリングパフォーマンスも改善します(特に動きをアニメーション化する場合)。