2016-04-28 10 views
1

Ich habe ein WPF UserControl, das wie ein Viewport fungiert (ich nenne es "Ansichtsfenster" in dem folgenden Kontext). In diesem Ansichtsfenster kann der Inhalt vergrößert und verkleinert werden (ich glaube, beim Zoomen wird entweder der Layout- oder RenderTransform-Befehl verwendet, um den Inhalt zu vergrößern). Grundsätzlich ist der Inhalt nur ein Canvas. Dieser Canvas enthält einige Formen und einige TextBoxen, die zum Anzeigen von Metadaten der Formen verwendet werden. Wenn der Zoomfaktor 1 ist alles in Ordnung, aber wenn ich verkleinern, schrumpft die Leinwand und auch die TextBoxen, die die Metadaten unlesbar, weil der Text so klein ist.Unscaled Steuerelemente in skalierten Eltern

Wie kann ich die TextBoxen zum Gegen-Zoom zwingen, so dass sie ihre Größe auf dem Bildschirm nicht ändern?

Ich habe darüber nachgedacht, die Transformation des Ansichtsfensters (das den Zoom verursacht) an die TextBoxen (irgendwie) zu übergeben und ihre Umkehrung darauf anzuwenden, aber das scheint mir falsch zu sein. Eine andere Möglichkeit ist die Verwendung von Adorner, das die TextBoxen enthält. Ich habe ein Thema über Adorners mit Controls here on Stackoverflow gefunden, aber ich bin nicht sicher, ob dieser Ansatz besser ist als der andere.

Also wenn jemand eine bessere Lösung bekommen würde, würde ich es begrüßen.

Vielen Dank im Voraus

Antwort

1

Es gibt eine Transform.Inverse Eigenschaft, die Sie verwenden können „Rückgängig“ Ihre übergeordnete Steuerung verwandeln. Daher binden Sie das übergeordnete Steuerelement an MyTransform und alle untergeordneten Steuerelemente an MyTransform.Inverse. Auf diese Weise wird die Transformation auf die Position der Kinder angewendet, nicht aber auf ihre Größe.

Ich stimme zu, dass es sich "falsch anfühlt", aber ich bin mir ziemlich sicher, dass es die beste Option ist.

+1

Das Problem ist, dass der Inhalt des Ansichtsfensters skaliert werden sollte. Aber der Inhalt des Inhalts sollte nicht skaliert werden. Ich habe es gelöst, indem ich eine Klasse erstellt habe, die als Datenkontext verwendet wird. Diese Klasse enthält eine Eigenschaft, die ein Double speichert, das die Skalierung darstellt. Das Ansichtsfenster hat eine Eigenschaft "ContentScale" und ein entsprechend geändertes Ereignis. Also verbinde ich die ContentScale im Grunde mit meinem Datenkontext, der wiederum an das Steuerelement gebunden ist, das unskaliert werden soll. Im Control konvertiere ich das Double in eine ScaleTransform (1/ContentScale für x und y). – Timo

+0

Ich glaube, ich habe dich richtig verstanden - Bindung an deine Eltern Die Inverse-Eigenschaft von transform sollte dir genau den gleichen Effekt geben wie das, was du jetzt manuell machst. Alles in Ihrem Ansichtsfenster wird weiterhin wie erwartet skaliert, mit Ausnahme aller untergeordneten Elemente, auf die Sie ViewPort.RenderTransform.Inverse explizit anwenden. Wie auch immer, froh, dass es funktioniert hat. – wilford

+0

Ja verbindlich die Transformation würde die Dinge einfacher machen, aber wie gesagt ich bin mir nicht ganz sicher, ob eine der Transformationen tatsächlich verwendet wird und das Ansichtsfenster eine Blackbox ist. Aber danke für deine Hilfe. – Timo

Verwandte Themen