Windows Phone 7:如何像XAML一样解析Bezier Path字符串

本文关键字:一样 Bezier 字符串 Path Phone 何像 XAML Windows | 更新日期: 2023-09-27 17:49:21

我需要解析贝塞尔路径字符串,但显然。net CF框架中的System.Windows.Media.Geometry版本没有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;

Windows Phone 7:如何像XAML一样解析Bezier Path字符串

我们目前没有为路径迷你语言解析器公开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;

请注意,这实际上不会通过API向你公开几何图形的细节,但你可以在你的应用程序中显示结果路径。