WPF, конвертируйте Path.DataProperty в объекты Segment - PullRequest
4 голосов
/ 13 марта 2010

Мне было интересно, существует ли инструмент для преобразования данных пути, таких как "M 0 0 l 10 10", в эквивалентный код сегмента линии / кривой.

В настоящее время я использую:

string pathXaml = "<Path xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" Data=\"M 0 0 l 10 10\"/>";
Path path = (Path)System.Windows.Markup.XamlReader.Load(pathXaml);

Мне кажется, что вызов XamlParser намного медленнее, чем явное создание отрезков. Однако преобразование множества путей вручную очень утомительно.

Ответы [ 2 ]

4 голосов
/ 15 марта 2010

Эта программа сделает преобразование: http://stringtopathgeometry.codeplex.com/

1 голос
/ 13 марта 2010

Нет ничего встроенного для генерации кода C # или VB из миниязыка геометрии, но вы можете создать его следующим образом:

  • Выдать код C # или VB для обновления PathGeometry.
  • Вызовите PathFigureCollection.Parse в строке вашего пути. Это вернет PathFigureCollection экземпляр.
  • Итерация по PathFigureCollection. Для каждой фигуры:
    • Запишите код C # или VB для нового объекта PathFigure и добавления его в коллекцию PathGeometry.Figures.
    • Перебрать коллекцию сегментов фигуры. Для каждого сегмента проанализируйте его тип и создайте код, зависящий от типа, для создания нового типа PathSegment, установки его свойств и добавления его в текущий PathFigure.

Является ли это более или менее утомительным занятием, чем преобразование путей вручную - это только то, что вы можете решить, хотя ... это, вероятно, зависит от того, сколько разных типов сегментов вам нужно обработать (то есть, сколько разных видов сегментов появляются в ваших путях), так как вам придется написать отдельный код для LineSegments, ArcSegments и т. д.

РЕДАКТИРОВАТЬ: Спасибо Anvaka в комментариях за упрощение первоначального ответа, обратив мое внимание на PathFigureCollection.Parse.

...