2010-03-12 5 views
4

Je me demandais s'il existait un outil pour convertir des données de chemin telles que "M 0 0 l 10 10" en code de ligne/segment de courbe équivalent.WPF, convertir des objets Path.DataProperty en segments

Actuellement, je suis en utilisant:

string pathXaml = "<Path xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" Data=\"M 0 0 l 10 10\"/>"; 
Path path = (Path)System.Windows.Markup.XamlReader.Load(pathXaml); 

Il me semble que l'appel XamlParser est beaucoup plus lent que de créer explicitement les segments de ligne. Cependant convertir beaucoup de chemins à la main est très fastidieux.

Répondre

1

Il n'y a rien intégré pour générer code C# ou VB de la minilanguage géométrie, mais vous pouvez en créer un comme suit:

  • Emit code C# ou VB pour nouveau-ing un PathGeometry.
  • Appelez PathFigureCollection.Parse sur votre chaîne de chemin d'accès. Cela renverra une instance PathFigureCollection.
  • Effectue l'itération sur le PathFigureCollection. Pour chaque figure:
    • Dressez code C# ou VB pour nouveau-ing un objet PathFigure et l'ajouter à la collection PathGeometry.Figures.
    • Effectue l'itération sur la collection Segments de la figure. Pour chaque segment, analysez son type et écrivez un code dépendant du type pour créer le type approprié de PathSegment, définir ses propriétés et l'ajouter au PathFigure en cours.

Que ce soit plus ou moins fastidieux que de convertir les chemins à la main est quelque chose que vous pouvez décider, mais ... cela dépend probablement de combien de différents types de segments dont vous avez besoin pour gérer (comment beaucoup de différents types de segments apparaissent dans vos chaînes de chemin), puisque vous devrez écrire un code séparé pour LineSegments, ArcSegments, etc.

EDIT: Merci à Anvaka dans les commentaires pour simplifier la réponse originale en attirant mon attention sur PathFigureCollection .Parse.

+0

Salut itowlson, il semble que l'auteur de la question utilise XamlReader qui est en effet lent pour ce genre d'opération. Au lieu de cela, vous pouvez lui suggérer d'utiliser la méthode * Geometry.Parse() *. Ce qui est plus rapide que XamlReader. BTW, dans votre scénario, vous pouvez également omettre les convertisseurs, et utilisez * PathFigureCollection.Parse() *:) ... Je pense toujours que votre réponse est correcte. – Anvaka

+0

Anvaka: garçon, mon visage est rouge. Je n'avais même pas réalisé que ces méthodes étaient publiques - je pensais que la seule façon de les atteindre était via le convertisseur. Je vais mettre à jour - merci beaucoup! (En ce qui concerne XamlReader vs l'analyse des chaînes, il semble qu'il ait édité la question pendant que j'écrivais - dans la version originale il définissait directement la propriété Path à partir d'une chaîne de code.) – itowlson

+0

Merci pour toutes les réponses, ouais j'ai édité la question, le code dans mon programme est légèrement différent mais l'idée est la même. Je vais mettre en œuvre l'optimisation suggérée. – user275587

Questions connexes