我有一个用折线对象动态制作的图形.它产生一些有趣的东西,但我想只保留最后10个坐标,一旦我们到达第10个位置,每个坐标将向左移动X个像素,新值将在最后添加. 在我的绘图类的Add函数
在我的绘图类的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的使用也使它更具可读性.