WPF Zoom Problem - wpf, zoom

In WPF habe ich eine Art Curve Editor, derbesteht aus einem Scrollviewer (zum Schwenken) oben auf einer Leinwand, wo ich Schlüssel und Kurvensegmente (linear, konstant und Splines) anzeigen kann. Ich verwende MVVM. Außerdem könnte ich Hunderte von Tasten haben, mit Segmenten zwischen einander. Auch das Schwenken / Zoomen muss wirklich glatt und ansprechend sein.

Im Modell (und ViewModel) hat ein Schlüssel XY-Positionen; Segmente haben a PointCollection. In der Ansicht sind die Schlüssel Rectangle, Kurvensegmente sind Polyline. Alle diese UI-Elemente sind mit den Abhängigkeitseigenschaften "Oben" und "Links" verknüpft.

Das Problem, das ich habe, ist bei der Implementierung des Zooms. Ich habe zuerst mit einer Viewbox gearbeitet, die zwischen dem Scrollviewer und der Leinwand eingefügt wurde

<ScrollViewer>
<Viewbox>
<Canvas/>
</Viewbox>
</ScrollViewer>

Schwenken funktionierte gut, aber der Zoom war nicht der richtige Zoom, den ich möchte. Es hat einen "grafischen" Zoom gemacht, der alles größer macht, Rechtecke und Polylinien.

Was ich will ist, dass beim Vergrößern die Tasten (Rechtecke) weiter auseinander gehen, ohne größer zu werden, und das Segment (Polyline) sich zwischen den beiden Tasten ausdehnt, ohne die StrokeThickness etwas größer aussehen.

Die Lösung, die ich wollte, ist, dass alle Koordinaten in der VM übersetzt werden, wenn der Zoom geändert wird.

Ex: Der Schlüssel im Modell hat eine Position von (2,3). Wenn der Wert des Zooms 2,0 beträgt, zeigt das ViewModel der Taste Positionen von (4,6) an. Für die Segmente übersetze ich alle Points in der PointCollection des Modells und lege sie in die PointCollection des ViewModels.

Das Problem mit dieser Lösung ist, dass es könnteBeim schnellen Ein- und Auszoomen wird es langsam, wenn ich Hunderte von Tasten habe. Da sich der Zoomfaktor ändert, werden alle ViewModels-Koordinaten geändert und somit werden alle UIElements verschoben.

Ich dachte über die RenderTransform auf derUIElements, um die Zoom-Übersetzung anzuwenden, aber es funktioniert nicht mit den Polylinien. Ich könnte eine ScaleTransform für die Polylinien verwenden, aber das wird sie visuell strecken.

Es ist ziemlich komplex zu beschreiben, fragen Sie einfach nach weiteren Details.

Irgendwelche Ideen, wie ich das erreichen könnte?

Antworten:

0 für die Antwort № 1

Ich habe etwas sehr ähnliches getan, was Sie wollen. Leider glaube ich nicht, dass Sie bekommen, was Sie wollen, indem Sie eine ViewBox oder sogar eine ScaleTransform verwenden.

Wahrscheinlich möchten Sie in das Erstellen eines eigenen Panels schauen, das IScrollInfo implementiert, so dass Sie mit dem Arrangement selbst arbeiten können.

Hoffe das hilft.