69 votes

WPF C# Path : Comment passer d'une chaîne de caractères avec des données de chemin à la géométrie en code (pas en XAML)

Je veux générer un objet WPF Path en code.

En XAML, je peux le faire :

 <Path Data="M 100,200 C 100,25 400,350 400,175 H 280">

Comment puis-je faire la même chose en code ?

 Path path = new Path();
 Path.Data = "foo"; //This won't accept a string as path data.

Existe-t-il une classe/méthode qui convertit la chaîne de caractères avec PathData en PathGeometry ou similaire ?

Le XAML doit bien être analysé et la chaîne de données convertie ?

134voto

Will Points 76760
var path = new Path();
path.Data = Geometry.Parse("M 100,200 C 100,25 400,350 400,175 H 280");

Path.Data est de type Geometry. Utilisation de Réflecteur JustDecompile (eff Red Gate) J'ai examiné la définition de Geometry pour son TypeConverterAttribute (que le sérialiseur xaml utilise pour convertir les valeurs du type string a Geometry ). Cela m'a conduit au GeometryConverter. En vérifiant l'implémentation, j'ai vu qu'elle utilisait Geometry.Parse pour convertir la valeur de la chaîne du chemin en une instance Geometry.

20voto

dbvega Points 41

Vous pourriez utiliser le mécanisme de liaison.

var b = new Binding
{
   Source = "M 100,200 C 100,25 400,350 400,175 H 280"
};
BindingOperations.SetBinding(path, Path.DataProperty, b);

J'espère que cela vous aidera.

4voto

Pour créer une géométrie à partir de la chaîne de texte originale, vous pouvez utiliser la classe System.Windows.Media.FormattedText avec la méthode BuildGeometry().

 public  string Text2Path()
    {
        FormattedText formattedText = new System.Windows.Media.FormattedText("Any text you like",
            CultureInfo.GetCultureInfo("en-us"),
              FlowDirection.LeftToRight,
               new Typeface(
                    new FontFamily(),
                    FontStyles.Italic,
                    FontWeights.Bold,
                    FontStretches.Normal),
                    16, Brushes.Black);

        Geometry geometry = formattedText.BuildGeometry(new Point(0, 0));

        System.Windows.Shapes.Path path = new System.Windows.Shapes.Path();
        path.Data = geometry;

        string geometryAsString = geometry.GetFlattenedPathGeometry().ToString().Replace(",",".").Replace(";",",");
        return geometryAsString;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X