Как переместить все координаты объекта WPF PolyLine?

StackOverflow https://stackoverflow.com/questions/1267687

  •  13-09-2019
  •  | 
  •  

Вопрос

У меня есть изображение, созданное динамически с помощью полилинейного объекта.Это дает что-то интересное, но я хотел бы сохранить только последние 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/С#?

Больше информации

Я могу сделать это, выполнив следующее:

            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], учитывая обстоятельства:

  1. Вам необходимо изменить Point с другим X ценить.
  2. Вы не можете изменить переменную foreach цикл, поэтому вам придется использовать for петля.
  3. 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 делает его более читабельным.

Другие советы

Вместо этого переместите весь холст влево и постоянно увеличивайте точку вставки для новых точек.

Если у вас много предметов, это также улучшит производительность рендеринга (особенно если вы анимируете движение).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top