Windows Phone 7: Как разобрать строку пути Безье, как в XAML?
У меня есть необходимость разобрать строки Безье пути, но, видимо, System.Windows.Media.Geometry
версия в.Net CF Framework не имеет Parse()
метод, который доступен в его нормальном аналоге. Однако ввод следующего XAML работает, поэтому должен быть способ, которым система анализирует строку данных пути.
<Path Stroke="Blue" Data="M 0 0 Q 10 10 20 0"/>
Любая подсказка о том, как я могу инициировать этот анализ самостоятельно с пользовательской строкой вне XAML?
Конечно, я также мог бы попытаться написать свой собственный синтаксический анализатор с использованием регулярных выражений или около того, но я бы предпочел не обрабатывать это сам, так как фреймворк явно на это способен.
Обновить
При использовании предложенного XAMLReader я получаю странное исключение, когда я устанавливаю StrokeThickness для вновь созданного Path
:
path.StrokeThickness = strokeWidth; //ArgumentException ??? (strokeWidth = 6)
Когда я изменяю codepath для рендеринга с использованием моего ручного парсера, все работает правильно. Я что-то здесь упускаю? Ничего не меняется, кроме парсера.
Генерация данных вручную:
//"M {0} {1} Q {2} {3} {4} {5}"
String regex_input = @"M (\d+) (\d+) Q (\d+) (\d+) (\d+) (\d+)";
Regex regex = new Regex(regex_input);
Match match = regex.Match(pathData);
int startx = int.Parse(match.Groups[1].Value);
int starty = int.Parse(match.Groups[2].Value);
int controlx = int.Parse(match.Groups[3].Value);
int controly = int.Parse(match.Groups[4].Value);
int endx = int.Parse(match.Groups[5].Value);
int endy = int.Parse(match.Groups[6].Value);
PathGeometry geo = new PathGeometry();
PathFigure figure = new PathFigure();
figure.StartPoint = new Point(startx, starty);
QuadraticBezierSegment quad = new QuadraticBezierSegment();
quad.Point1 = new Point(controlx, controly);
quad.Point2 = new Point(endx, endy);
figure.Segments.Add(quad);
geo.Figures.Add(figure);
path.Data = geo;
Использование XamlReader
String formattedXAMLInput = String.Format("<Path xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' Stroke='Black' Data='{0}'/>", pathData);
Path xamlpath = (Path)XamlReader.Load(formattedXAMLInput);
Geometry xamldata = xamlpath.Data;
path.Data = xamldata;
1 ответ
В настоящее время мы не предоставляем API для парсера мини-языка path. Это внутри парсера XAML.
Однако вы можете динамически создавать объекты Path на основе мини-языковых строк, используя XamlReader:
Path path = XamlReader.Load("<Path xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' Stroke='Blue' Data='M 0 0 Q 10 10 20 0'/>") as Path;
Обратите внимание, что это на самом деле не предоставит вам детали геометрии через API, но вы можете отобразить полученный путь в своем приложении.