2010-12-14 89 views
3

ma question est simple.Convertir une géométrie en un chemin dans wpf (avec blend?)

Comment convertir ce code:

<Path> 
    <Path.Data> 
     <EllipseGeometry Center="5,4" RadiusX="4" RadiusY="4"/> 
    </Path.Data> 
</Path> 

dans quelque chose comme

<Path Data="M 0 5 L 3 10 10 0"/> 

(s'il vous plaît noter que le deuxième produit une coche, pas une ellipse Il était juste à des fins d'illustration,. et mon but est juste: trouver quelle séquence donne une ellipse)

edit: J'ai aussi lu la doc sur les courbes de Bézier dans xaml et suis pleinement conscient que je pourrais simplement produire t Le code de droite est calculé en calculant les points précis de la courbe de Bézier pour obtenir une ellipse, mais je ne veux pas me lancer dans ce calcul, alors je me demandais s'il y avait un moyen facile de le faire.

+0

Dupliquer de http://stackoverflow.com/questions/5227830/convert-geometry-path-to- minilanguage-string – jpierson

Répondre

7

Ceci montre comment le faire à partir du code. Je ne suis pas sûr si cela va résoudre votre problème ou non - vous dites "avec mélange"? dans le titre, et je ne suis pas au courant d'un moyen de le faire dans Blend. Mais j'espère que cela peut aider.

La première étape serait de convertir le EllipseGeometry en PathGeometry:

var geom = new EllipseGeometry(new Point(5, 4), 4, 4); 
var pathGeometry = PathGeometry.CreateFromGeometry(geom); 

Une fois que vous avez un PathGeometry vous pouvez simplement appeler ToString et il vous donnera la représentation chaîne:

string pathText = pathGeometry.ToString(); 

Sur mon système, ceci produit le texte plutôt bavard suivant:

"M9,4C 9,6.20913899932317 7.20913899932317,8 5,8 2.79086100067683,8 1,6.20913899932317 1,4 1,1.79086100067683 2.79086100067683,0 5,0 7.20913899932317,0 9,1.79086100067683 9,4z »

Maintenant, si vous voulez finir avec exactement ce que vous auriez obtenu si vous nourri cette chaîne en XAML, vous avez besoin d'une étape supplémentaire, parce que Xaml de la forme que vous avez fourni:

<Path Data="M 0 5 L 3 10 10 0"/> 

ne produit pas un PathGeometry. Il produit un StreamGeometry, ce qui est une représentation légèrement plus efficace, mais fixe du chemin. (La principale différence étant que vous ne pouvez pas mettre la main sur des objets individuels représentant les différentes figures et segements dans un StreamGeometry, alors que vous pouvez avec un PathGeometry. StreamGeometry est moins cher, en conséquence.)

Vous pouvez obtenir un StreamGeometry du texte de chemin:

var streamGeometry = StreamGeometry.Parse(pathText); 

Et si vous voulez que dans un Path juste le construire:

var p = new Path { Data = streamGeometry }; 

Selon ce que votre objectif exact est, il peut y avoir des moyens plus efficaces de le faire. (StreamGeometry est une représentation plus efficace car elle crée beaucoup moins d'objets.Mais la route par laquelle mon code arrive à cette représentation n'est pas très efficace, donc vous feriez mieux de vous arrêter avec le PathGeometry que le tout premier extrait de code produit .Alternativement, si votre objectif est vraiment juste pour obtenir le texte du chemin, alors le PathGeometry est également suffisant pour vos besoins.)

+0

c'est en effet plus que ce que je voulais. les deux premières étapes et le résultat: "M9,4C9,6.20913899932317 7.20913899932317,8 5,8 2,79086100067683,8 1,6.20913899932317 1,4 1,1,79086100067683 2,79086100067683,0 5,0 7,20913899932317,0 9,1,79086100067683 9,4z" où juste ce que je voulais. Parfait! Le reste est un bon bonus :) (Je ne savais pas que le StreamGeometry était meilleur ... Je vais le regarder – David

+0

Je ne dirais pas forcément que StreamGeometry est toujours "meilleur". vous perdez une certaine flexibilité en conséquence. –