Как переместить все координаты объекта WPF PolyLine?
Вопрос
У меня есть изображение, созданное динамически с помощью полилинейного объекта.Это дает что-то интересное, но я хотел бы сохранить только последние 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]
, учитывая обстоятельства:
- Вам необходимо изменить
Point
с другимX
ценить. - Вы не можете изменить переменную
foreach
цикл, поэтому вам придется использоватьfor
петля. myPolyline.Points[i].X -= 50
не будет работать из-за способаPoint
Структура извлекается из массива, а затем не переназначается автоматически.
Если вы просто хотели переместить весь PolyLine
, я мог бы предложить LayoutTransform
или RenderTransform
, но вы перемещаете подмножество Point
s, а затем добавит других.
Редактировать: Если вы действительно хотите провести рефакторинг этой операции, вы можете создать метод расширения для 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 ) );
Вам все равно придется изменить Point
s таким же образом, но он подвергся рефакторингу в другом месте, чтобы его использование было более читабельным.И использование Vector
делает его более читабельным.
Другие советы
Вместо этого переместите весь холст влево и постоянно увеличивайте точку вставки для новых точек.
Если у вас много предметов, это также улучшит производительность рендеринга (особенно если вы анимируете движение).