WPFポリラインオブジェクトからすべての座標を移動する方法は?

StackOverflow https://stackoverflow.com/questions/1267687

  •  13-09-2019
  •  | 
  •  

質問

ポリラインオブジェクトで動的に作られたグラフィックがあります。興味深いものが生成されますが、最後の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], 、状況を考慮して:

  1. 変更する必要があります Point 別のもので X 価値。
  2. aの変数を変更することはできません foreach ループして、aを使用する必要があります for ループ。
  3. myPolyline.Points[i].X -= 50 方法のために機能しません Point 構造体は配列から取得され、自動的に再割り当てされません。

単に全体を移動したい場合 PolyLine, 、私は提案したかもしれません LayoutTransform また RenderTransform, 、しかし、あなたはのサブセットを動かしています Pointsしてから、他の人を追加します。

編集: 本当にその操作をリファクタリングしたい場合は、拡張メソッドを作成できます 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 読みやすくします。

他のヒント

代わりにキャンバス全体を左に移動し、常に新しいポイントの挿入ポイントを増やします。

たくさんのアイテムがある場合、これはレンダリングパフォーマンスも改善します(特に動きをアニメーション化する場合)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top