356 Stimmen

Wie erhalten Sie Steuerelemente in WPF, um den verfügbaren Platz zu füllen?

Einige WPF-Steuerelemente (wie das Button ) scheinen fröhlich den gesamten verfügbaren Platz in ihrem Container zu verbrauchen, wenn Sie nicht die Höhe angeben, die sie haben sollen.

Und einige, wie die, die ich gerade benutzen muss, die (mehrzeiligen) TextBox y el ListBox scheinen mehr darauf bedacht zu sein, nur den notwendigen Platz für ihren Inhalt zu beanspruchen, und nicht mehr.

Wenn man diese Jungs in eine Zelle in einem UniformGrid werden sie sich an den verfügbaren Platz anpassen. Allerdings, UniformGrid Instanzen sind nicht für alle Situationen geeignet. Was ist, wenn Sie ein Raster haben, bei dem einige Zeilen auf eine * Höhe eingestellt sind, um die Höhe zwischen sich und anderen * Zeilen aufzuteilen? Was ist, wenn Sie ein StackPanel und Sie haben eine Label , a List und eine Button Wie können Sie erreichen, dass die Liste den gesamten Platz einnimmt, der nicht von der Beschriftung und der Schaltfläche belegt wird?

Ich würde denken, dass dies eine grundlegende Layoutanforderung ist, aber ich kann nicht herausfinden, wie ich sie dazu bringe, den Platz zu füllen, den sie füllen könnten (indem ich sie in ein DockPanel und die Einstellung auf "Füllen" funktioniert anscheinend auch nicht, da die DockPanel nimmt nur den Platz ein, der für seine Untersteuerungen benötigt wird).

Eine größenveränderbare GUI wäre ziemlich schrecklich, wenn man mit Height , Width , MinHeight , MinWidth usw.

Können Sie Ihre Height y Width Eigenschaften für die Gitterzelle, in der Sie sich befinden? Oder gibt es eine andere Möglichkeit, dies zu tun?

280voto

Matt Hamilton Punkte 193704

Es gibt auch einige Eigenschaften, die Sie einstellen können, um ein Steuerelement zu zwingen, den verfügbaren Platz zu füllen, wenn es dies sonst nicht tun würde. Zum Beispiel können Sie sagen:

HorizontalContentAlignment="Stretch"

... um den Inhalt eines Steuerelements horizontal zu strecken. Oder Sie können sagen:

HorizontalAlignment="Stretch"

... um das Steuerelement selbst zu zwingen, sich horizontal zu strecken, um sein übergeordnetes Element auszufüllen.

176voto

user3837 Punkte 2196

Jede Kontrolle, die sich von Panel implementiert eine bestimmte Layout-Logik, die in Measure() y Arrange() :

  • Measure() bestimmt die Größe des Panels und jedes seiner Unterelemente
  • Arrange() bestimmt das Rechteck, in dem jedes Steuerelement dargestellt wird

Das letzte Kind der DockPanel füllt den verbleibenden Platz. Sie können dieses Verhalten deaktivieren, indem Sie die Einstellung LastChild Eigenschaft zu false .

En StackPanel fragt jedes Kind nach seiner Wunschgröße und stapelt sie dann. Das Stapel-Panel ruft Measure() für jedes Kind, mit einer verfügbaren Größe von Infinity und verwendet dann die gewünschte Größe des Kindes.

A Grid den gesamten verfügbaren Platz einnimmt, wird jedoch jedes Kind auf die gewünschte Größe eingestellt und dann in der Zelle zentriert.

Sie können Ihre eigene Layout-Logik implementieren, indem Sie von Panel und dann die Überschreibung MeasureOverride() y ArrangeOverride() .

Siehe dieser Artikel für ein einfaches Beispiel.

26voto

Rune Jacobsen Punkte 9597

Nun, ich habe es selbst herausgefunden, gleich nachdem ich es gepostet hatte, und das ist die peinlichste Art :)

Es scheint, dass jedes Mitglied eines StackPanels einfach seine minimale angeforderte Größe ausfüllen wird.

Im DockPanel hatte ich die Dinge in der falschen Reihenfolge angedockt. Wenn die TextBox oder ListBox das einzige angedockte Element ohne Ausrichtung ist oder als letztes hinzugefügt wurde, werden sie den verbleibenden Platz wie gewünscht ausfüllen.

Ich würde mich über eine elegantere Methode freuen, aber es geht auch so.

6voto

urini Punkte 30897

Verwenden Sie die HorizontaleAusrichtung y VertikaleAusrichtung Layout-Eigenschaften. Sie steuern, wie ein Element den Platz nutzt, den es in seinem übergeordneten Element hat, wenn mehr Platz zur Verfügung steht, als es das Element benötigt.

Die Breite eines StackPanels ist beispielsweise so breit wie das breiteste Element, das es enthält. Alle schmaleren Elemente haben also einen gewissen Überschuss an Platz. Die Ausrichtungseigenschaften steuern, was das untergeordnete Element mit dem zusätzlichen Platz macht.

Der Standardwert für beide Eigenschaften ist Dehnen, so dass das untergeordnete Element so gedehnt wird, dass es den gesamten verfügbaren Platz ausfüllt. Zusätzliche Optionen sind Left, Center und Right für HorizontaleAusrichtung und Oben, Mitte und Unten für VertikaleAusrichtung .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X