加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:31:46 所属栏目:百科 来源:网络整理
导读:我有一个用折线对象动态制作的图形.它产生一些有趣的东西,但我想只保留最后10个坐标,一旦我们到达第10个位置,每个坐标将向左移动X个像素,新值将在最后添加. 在我的绘图类的Add函数中,我尝试了这种代码: if (points.Count 10) { myPolyline.Points.RemoveAt(
我有一个用折线对象动态制作的图形.它产生一些有趣的东西,但我想只保留最后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的使用也使它更具可读性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读