Bindung an X Y-Koordinaten des Elements in WPF Canvas

8

Ich habe ein Canvas mit 2 "Punkten" darauf gezeichnet. Siehe diesen (vereinfachten) Code:

%Vor%

Wie Sie sehen, möchte ich die Leinwand mit der angegebenen RotateTransform drehen.

Als nächstes möchte ich einen TextBlock in der Nähe jeder Ellipse (ein Label) platzieren. Ich möchte diesen TextBlock jedoch nicht in den Canvas-Bereich einfügen, da er sich dann ebenfalls dreht. Ich möchte, dass der Text horizontal bleibt.

Irgendeine Idee, wie Sie das elegant lösen können?

    
Robbert Dam 04.01.2012, 15:18
quelle

2 Antworten

3

So etwas sollte für dich funktionieren

%Vor%

Ordnen Sie das Textfeld transformation matrix und invers der Transformationsmatrix von Canvas zu.

    
Tigran 04.01.2012, 15:29
quelle
0

Gute Frage! Und ich werde raten, also nimm bitte diese Antwort mit einer Prise Salz.

Ich glaube, Sie versuchen, Textanmerkungen neben Ellipsen auf einer gedrehten Leinwand zu platzieren, aber diese Anmerkungen müssen horizontal bleiben. Zwei Dinge könnten Sie versuchen:

  • Erstens, wenn Sie den XY-Punkt kennen, den Sie über die einzelnen Ellipsen von Canvas.GetTop / GetLeft kennen, können Sie seine neue gedrehte XY-Position finden, indem Sie die RotateTransform auf die Ellipsenposition anwenden, indem Sie die Formel U = M * V verwenden , wobei U der Ausgabepunkt, V der Eingabepunkt (XY-Position der Ellipse) und M die Rotationsmatrix ist.

  • Zweitens können Sie eine zweite Leinwand über die erste legen (vorausgesetzt, sie befinden sich beide in einem Raster, die zweite Leinwand hat einen höheren Z-Index und dieselbe Größe wie die darunter liegende Leinwand). Nennen Sie es eine Annotationsebene. Ihre Anmerkungen (Textbeschriftungen) können an den neuen transformierten Positionen erscheinen und mit diesem Ansatz nicht rotiert werden.

Sie müssten dies natürlich in Code tun, nicht in Xaml, obwohl Sie vielleicht einen verbindlichen, freundlichen Ansatz finden würden, indem Sie einen Wertkonverter für den TextBlock erstellen, der an die Quelle RotateTransform / Ellipse und habe diese Operation für dich gemacht.

Ein anderer Ansatz wäre, die .Inverse der RotateTransform zu übernehmen und diese auf die Textblöcke anzuwenden, jedoch müssen Sie möglicherweise noch übersetzen, um an den neuen Ort zu gelangen. Wie auch immer ich denke, es erfordert einige Experimente.

Mit freundlichen Grüßen

    
Dr. ABT 04.01.2012 15:28
quelle

Tags und Links