2010-01-08 2 views
62

Ich möchte ein WPF-Pfadobjekt in Code generieren.WPF C# -Pfad: Wie man von einer Zeichenfolge mit Pfaddaten zu Geometrie in Code (nicht in XAML)

In XAML kann ich dies tun:

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

Wie kann ich das gleiche in-Code zu tun?

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

Gibt es eine Klasse/Methode zur Verfügung, die die Zeichenfolge mit PathData zu PathGeometry oder ähnlichen konvertiert?

Sicher irgendwie wird der XAML geparst und die Daten-String konvertiert?

Antwort

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

Path.Data ist vom Typ Geometrie. Mit Reflektor JustDecompile (eff Red Gate), schaute ich auf die Definition von Geometrie für seine TypeConverterAttribute (die der XAML-Serializer verwendet, um Werte des Typs string in Geometry zu konvertieren). Dies wies mich auf den GeometryConverter hin. Beim Auschecken der Implementierung habe ich gesehen, dass Geometry.Parse verwendet wird, um den Zeichenfolgenwert des Pfads in eine Geometry-Instanz zu konvertieren.

+0

Nun, nahm ich eine Minute, um eine Google-Suche nach der Antwort zu tun und didn‘verwenden könnte Ich finde nichts Vernünftiges. Also, in solchen Fällen (einfache Lösungen müssen existieren), schaute ich auf den Code. Da ich wusste, wie sich WPF von Strings zu komplexen Typen bewegt, folgte ich der Führung. Das Verständnis des Prozesses ist von zweiter Wichtigkeit, um die Antwort zu kennen. – Will

+5

Beachten Sie, dass diese Lösung nicht auf WP7 funktioniert. – Peterdk

+0

@Peterdk: Gibt es eine Alternative in WP7? Wie wandelt ein WP7-Pfad eine Zeichenfolge in Geometrie um? – Will

18

Sie könnten den Bindungsmechanismus verwenden.

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

Ich hoffe, es hilft Ihnen.

+3

Es stellt sich heraus, dass Sie dies für Windows Store und Phone Apps tun müssen. 'Geometry.Parse' befindet sich in einem Namespace, der in diesem Profil nicht unterstützt wird. – Travis

2

Um Geometrie von der ursprünglichen Textzeichenfolge machen Sie System.Windows.Media.FormattedText Klasse mit BuildGeometry() Methode

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; 
    } 
Verwandte Themen