我有一个用折线对象动态制作的图形。它产生了一些有趣的东西,但我想只保留最后 10 个坐标,一旦我们到达第 10 个位置,每个坐标都会向左移动 X 像素,新值将添加到最后。

在我的绘图类的 Add 函数中,我尝试了这种代码:

        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 循环,所以你必须使用 for 环形。
  3. myPolyline.Points[i].X -= 50 不会工作,因为 Point struct 从数组中检索,然后不会自动重新分配。

如果你只是想移动整个 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以同样的方式,但它在其他地方进行了重构,以便用法更具可读性。以及使用 Vector 也使其更具可读性。

其他提示

向左移动,而不是整个画布并增加insertionpoint为新的点的所有时间。

如果您有吨的项目,这也将提高渲染性能(特别是如果你的动画运动)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top