2010-03-12 2 views
4

Мне было интересно, есть ли инструмент для преобразования данных пути, например «M 0 0 10 10», в его эквивалентный код сегмента линии/кривой.WPF, конвертировать объекты Path.DataProperty в сегмент

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

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 гораздо медленнее, чем явно создавая сегменты линии. Однако преобразование множества путей вручную очень утомительно.

ответ

1

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

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

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

EDIT: Спасибо Анваке в комментариях для упрощения первоначального ответа, обратив мое внимание на PathFigureCollection .Parse.

+0

Привет itowlson, похоже, автор вопроса использует XamlReader, который действительно медленный для такого рода операций. Вместо этого вы можете предложить ему использовать метод * Geometry.Parse() *. Это быстрее, чем XamlReader. Кстати, в вашем сценарии вы также можете опустить конвертеры и использовать * PathFigureCollection.Parse() *:) ... Я все еще думаю, что ваш ответ правильный. – Anvaka

+0

Anvaka: мальчик, мое лицо красное. Я даже не понимал, что эти методы публичны - я думал, что единственный способ добраться до них - через конвертер. Я буду обновлять - большое спасибо! (Что касается XamlReader и синтаксического анализа строк, похоже, он редактировал вопрос во время написания - в исходной версии, которую он настраивал, напрямую устанавливая свойство Path из строки в коде.) – itowlson

+0

Спасибо за все ответы, да, я редактировал вопрос, код в моей программе немного отличается, но идея такая же. Я буду реализовывать предложенную оптимизацию. – user275587