【问题标题】:How to move all coordinate from a WPF PolyLine object?如何从 WPF PolyLine 对象中移动所有坐标?
【发布时间】:2010-11-19 01:20:12
【问题描述】:

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

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

        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);
            }

但我想要一种更简洁的方式来做到这一点,而不必非常频繁地创建点对象。

【问题讨论】:

    标签: c# .net wpf polyline


    【解决方案1】:

    嗯,Point 是一个结构,所以创建新结构的开销应该不错。执行以下操作...

    Point p = this.myPolyline.Points[i];
    p.X -= 50;
    this.myPolyline.Points[i] = p;
    

    ...真的没有什么不同,只是因为结构是按值传递的。

    考虑到具体情况,您几乎陷入了for 循环并重新分配给myPolyline.Points[i]

    1. 您必须使用不同的X 值修改Point
    2. 你不能修改foreach循环的变量,所以你必须使用for循环。
    3. myPolyline.Points[i].X -= 50 不起作用,因为 Point 结构是从数组中检索出来的,然后不会自动重新分配。

    如果您只是想移动整个PolyLine,我可能会建议使用LayoutTransformRenderTransform,但您要移动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 的使用也使其更具可读性。

    【讨论】:

    • +1 并接受答案。非常完整的答案。感谢您分享您的知识。
    • 不客气。老实说,直到我查看PointCollectionPoint 的成员并看到后者具有运算符重载时,我才知道Vector
    【解决方案2】:

    将整个画布向左移动,并一直增加新点的插入点。

    如果您有大量项目,这也将提高渲染性能(尤其是在您为运动设置动画时)。

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 2022-09-28
      • 2015-08-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多