c# - Windows Phone 7: ¿Cómo se analiza la cadena Bezier Path como en XAML?
windows-phone-7 geometry (1)
Actualmente no exponemos una API para el analizador de mini idiomas de ruta. Es interno al analizador XAML.
Sin embargo, puede crear objetos Path de forma dinámica en función de cadenas de minidiomas, utilizando 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;
Tenga en cuenta que esto no expondrá los detalles de la geometría a través de la API, pero puede mostrar la ruta de acceso resultante en su aplicación.
Tengo la necesidad de analizar Bezier Path Strings, pero aparentemente la versión de System.Windows.Media.Geometry
en el framework .Net CF no tiene el método Parse()
que está disponible en su contraparte normal. Sin embargo, ingresar el siguiente XAML funciona, por lo que debe haber una forma en que el sistema analiza la Cadena de datos de ruta.
<Path Stroke="Blue" Data="M 0 0 Q 10 10 20 0"/>
¿Alguna pista sobre cómo puedo iniciar este análisis con una cadena personalizada fuera de XAML?
Por supuesto, también podría intentar escribir mi propio analizador usando expresiones regulares, pero preferiría no manejarlo yo mismo, ya que el marco es claramente capaz de hacerlo.
Actualizar
Cuando uso el XAMLReader sugerido, obtengo una excepción extraña cuando establezco un StrokeThickness en la nueva Path
creada:
path.StrokeThickness = strokeWidth; //ArgumentException ??? (strokeWidth = 6)
Cuando cambio la ruta de código para procesar usando mi analizador manual, todo funciona correctamente. ¿Me estoy perdiendo de algo? Nada cambia excepto el analizador.
Generación manual de datos:
//"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;
Usando 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;