2008-10-01 16 views
28

Wie können Sie Elemente in WPF relativ positionieren? Das Standardmodell besteht darin, Layout-Manager für alles zu verwenden. Was aber, wenn Sie Elemente (z. B. auf einem Canvas) einfach anhand der Position anderer Elemente positionieren möchten?Wie machen Sie relative Positionierung in WPF?

Zum Beispiel könnte es sein, dass ein Element (zB eine Schaltfläche) an der Seite eines anderen (etwa eines Panels) angebracht werden soll, unabhängig von der Position oder dem Layout dieses Panels. Jeder, der mit Konstruktionswerkzeugen (SolidWorks, AutoCad usw.) gearbeitet hat, kennt diese Art der relativen Positionierung.

Alles in Layout-Manager (die verschiedenen WPF-Panels) zu erzwingen macht wenig Sinn für bestimmte Szenarien, in denen es nicht wichtig ist, dass Elemente von einem übergeordneten Container verwaltet werden und Sie nicht möchten, dass die anderen Kinder betroffen sind eine Änderung im Layout/Aussehen der anderen. Unterstützt WPF dieses relative Positionierungsmodell in irgendeiner Weise?

+0

Ich bin mir nicht sicher, ob ich die Frage vollständig verstehe. Können Sie ein Beispiel für ein Bildschirmlayout nennen, von dem Sie nicht glauben, dass es mit dem WPF-Modell erreicht werden kann? –

+0

Ich stimme zu, die Frage ist verwirrend ... es scheint wie ein einfaches StackPanel würde den Trick tun. – cplotts

+2

Ich denke nicht, dass es verwirrend ist, und ein StackPanel würde nur die einfachsten Fälle behandeln. Was er will, ist das Äquivalent von RelativeLayout in Android. – user316117

Antwort

10

Gute Frage. Soweit ich weiß, müssen wir ein anderes benutzerdefiniertes Panel haben, um diese Funktion zu bekommen. Da WPF auf Visual History basiert, gibt es keine Möglichkeit, diese Art von Flat-Struktur für die Elemente in der Plattform zu haben.

Aber hier ist ein Trick, dies zu tun. Platzieren Sie Ihre Elemente an derselben Position und geben Sie relative Verschiebung mithilfe von RenderTransform.TranslateTransform. Auf diese Weise werden TranslateTransfroms X und Y immer mit dem anderen Element verknüpft.

+0

Vielen Dank dafür. Arbeitete einen Charme. –

+0

Können Sie etwas Code posten? – user844541

+0

_ "WPF basiert auf Visual Hierarchy gibt es keine Möglichkeit" _ - das war seit den ersten Versionen von WPF falsch. Siehe "Gitter" als Referenz. – Gusdor

13

Anstatt (wie in Ihrem Beispiel) eine Schaltfläche direkt auf der Zeichenfläche zu platzieren, können Sie ein Stackpanel horizontal ausgerichtet auf die Zeichenfläche legen und die beiden Schaltflächen dort einfügen.

Wie so:

<Canvas> 
    <StackPanel Canvas.Left="100" Canvas.Top="100" Orientation="Horizontal"> 
    <Button>Button 1</Button><Button>Button 2</Button> 
    </StackPanel> 
</Canvas> 

alt text

Ich denke, dass es sehr flexibel ist, wenn Sie mehr als 1 Layout in einem Formular verwenden, und Sie können so ziemlich jede gewünschte Konfiguration erstellen.

+0

Die Kombination dieses Vorschlags mit dem von Jobi Joy wäre ein Workaround, den ich vermute: Sie würden ein Stackpanel in ein Canvas einfügen und TranslateTransform verwenden, um den Abstand zwischen den Elementen anzupassen. – ArthurT