【发布时间】:2011-04-08 14:23:06
【问题描述】:
我需要解析 Bezier 路径字符串,但显然 .Net CF 框架中的 System.Windows.Media.Geometryversion 没有在其正常对应物中可用的 Parse() 方法。但是,输入以下 XAML 确实有效,因此系统必须有一种方法来解析路径数据字符串。
<Path Stroke="Blue" Data="M 0 0 Q 10 10 20 0"/>
任何关于如何使用 XAML 外部的自定义字符串启动解析自己的线索?
我当然也可以尝试使用正则表达式编写自己的解析器,但我不希望自己处理这个问题,因为框架显然可以做到。
更新
使用建议的 XAMLReader 时,当我将 StrokeThickness 设置为新创建的 Path 时,会收到一个奇怪的异常:
path.StrokeThickness = strokeWidth; //ArgumentException ??? (strokeWidth = 6)
当我更改代码路径以使用手动解析器进行渲染时,一切正常。 我在这里错过了什么吗?除了解析器没有任何变化。
手动生成数据:
//"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;
【问题讨论】:
标签: c# xaml silverlight windows-phone-7 bezier