当前位置 : 主页 > 编程语言 > c语言 >

c# – 如何从WPF PolyLine对象移动所有坐标?

来源:互联网 收集:自由互联 发布时间:2021-06-25
我有一个用折线对象动态制作的图形.它产生一些有趣的东西,但我想只保留最后10个坐标,一旦我们到达第10个位置,每个坐标将向左移动X个像素,新值将在最后添加. 在我的绘图类的Add函数
我有一个用折线对象动态制作的图形.它产生一些有趣的东西,但我想只保留最后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]:

>您必须使用不同的X值修改Point.
>您无法修改foreach循环的变量,因此必须使用for循环.
> 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 ) );

您仍然需要以相同的方式更改Points,但它会在其他地方重构,以便使用更具可读性. Vector的使用也使它更具可读性.

网友评论