Windows Phone 7:如何在XAML中解析Bezier Path字符串?

Pet*_*rdk 5 c# silverlight xaml bezier windows-phone-7

我需要解析Bezier Path Strings,但显然System.Windows.Media.Geometry.Net CF框架中的版本没有Parse()正常对应的方法.但是,输入以下XAML确实有效,因此系统必须有一种解析Path Data String的方法.

<Path Stroke="Blue" Data="M 0 0 Q 10 10 20 0"/>

有关如何使用XAML外部的自定义字符串启动此解析的任何线索?

我当然也可以尝试使用正则表达式来编写我自己的解析器,但我不想自己处理它,因为框架显然能够实现它.

更新

当使用建议的XAMLReader时,当我将StrokeThickness设置为新创建时,我得到一个奇怪的异常Path:

path.StrokeThickness = strokeWidth; //ArgumentException ??? (strokeWidth = 6)
Run Code Online (Sandbox Code Playgroud)

当我使用我的手动解析器更改代码路径以进行渲染时,一切正常.我在这里错过了什么吗?除解析器外没有任何变化.

手动生成数据:

        //"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;
Run Code Online (Sandbox Code Playgroud)

使用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;
Run Code Online (Sandbox Code Playgroud)

Ste*_*SFT 7

我们目前不公开路径迷你语言解析器的API.它是XAML解析器的内部.

但是,您可以使用XamlReader基于迷你语言字符串动态创建Path对象:

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;
Run Code Online (Sandbox Code Playgroud)

请注意,这实际上不会通过API向您公开几何体的细节,但您可以在应用程序中显示生成的路径.