2010-12-14 4 views
3

meine Frage ist einfach.Konvertieren Sie eine Geometrie in einen Pfad in WPF (mit Blend?)

wie kann ich konvertieren diesen Code:

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

in so etwas wie

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

(bitte beachten Sie, dass der zweite ein Häkchen erzeugt, nicht eine Ellipse Es war nur zu Veranschaulichungszwecken. und mein ziel ist genau das: find welche sequenz gibt eine ellipse)

edit: ich lese auch das doc über bézier kurven in xaml und bin mir voll bewusst, dass ich einfach t produzieren könnte Er hat den richtigen Code, indem er die genauen Punkte der Bezier-Kurve berechnet, um eine Ellipse zu erhalten, aber ich möchte nicht die Mühe machen, diese Berechnung selbst durchzuführen, also habe ich mich gefragt, ob es einen einfachen Weg gibt (vielleicht in Blend))

+0

Duplizieren von http://StackOverflow.com/Questions/5227830/convert-Geometry-Path-to- Minilanguage-String – jpierson

Antwort

7

Dies zeigt, wie man es aus dem Code macht. Ich bin mir nicht sicher, ob das dein Problem löst oder nicht - du sagst "mit Blend?" im Titel, und mir ist keine Möglichkeit bekannt, dies in Blend zu tun. Aber ich hoffe, das kann helfen.

Der erste Schritt wäre die EllipseGeometry in ein PathGeometry zu konvertieren:

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

Sobald Sie eine PathGeometry haben rufen Sie einfach ToString und es wird Ihnen die Stringdarstellung geben:

string pathText = pathGeometry.ToString(); 

Auf meinem System ergibt es den folgenden eher ausführlichen Text:

„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“

Nun, wenn Sie genau wollen am Ende was du hast, wenn Sie diese Zeichenfolge in XAML zugeführt würde, müssen Sie einen weiteren Schritt, weil XAML des Formulars Sie geliefert haben:

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

keine PathGeometry erzeugt. Es erzeugt eine StreamGeometry, die eine etwas effizientere, aber feste Darstellung des Pfades ist. (Der Hauptunterschied ist, dass Sie nicht halten, einzelne Objekte bekommen, die verschiedenen Figuren und segements in einem StreamGeometry darstellt, während Sie können mit einem PathGeometry. StreamGeometry ist billiger, als Ergebnis.)

Sie können eine StreamGeometry bekommen vom Pfad Text:

var streamGeometry = StreamGeometry.Parse(pathText); 

Und dann, wenn Sie in einem Path es, dass nur bauen:

var p = new Path { Data = streamGeometry }; 

auf dem, was Ihr genaues Ziel Je Es gibt möglicherweise effizientere Möglichkeiten, dies zu tun. (StreamGeometry ist eine effizientere Darstellung, weil es am Ende viel weniger Objekte erstellt. Aber die Route, mit der mein Code zu dieser Darstellung gelangt, ist nicht sehr effizient, so dass Sie besser mit dem PathGeometry stoppen, die das erste Code-Snippet erzeugt .Alternativ, wenn Ihr Ziel wirklich nur ist, um den Pfad Text zu bekommen, dann ist die PathGeometry auch ausreichend für Ihre Bedürfnisse.)

+0

das ist in der Tat mehr als ich wollte. die ersten beiden Schritte und das Ergebnis: "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" wo gerade was ich wollte. Perfekt! Der Rest ist ein guter Bonus :) (Ich wusste nicht, dass die StreamGeometry besser ist ... Ich werde es mir ansehen – David

+0

Ich würde nicht unbedingt sagen, dass StreamGeometry immer "besser" ist. Es ist mehr Speicher-effizient, aber Sie verlieren dadurch etwas an Flexibilität. –

Verwandte Themen