c# – 如何从WPF PolyLine对象移动所有坐标?
我有一个用折线对象动态制作的图形.它产生一些有趣的东西,但我想只保留最后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. 如果您只是想移动整个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的使用也使它更具可读性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c – char **&argument confusion
- c# – 为什么.NET 4.0 Client Profile中没有System.Data.Or
- 序列化类如何加入persistence.xml ?
- iis – 多个域的单一SSL
- objective-c – iOS UnitTests:无法链接到我的Application
- postgresql – 使用SQLAlchemy和Alembic检查数据库中是否存
- 求高手解答FL2440的问题
- ajax – 如何在Google Vizualization Bar Charts中自定义工
- c# – 如何使用Entity Framework包含已排序的导航属性
- c# – 如何检查NLog是否已在异步模式下从队列中记录消息?