Einige WPF-Steuerelemente (wie das Button
) scheinen den gesamten verfügbaren Speicherplatz in ihrem Container zu belegen, wenn Sie nicht die Höhe angeben, die sie haben sollen.
Und einige, wie die, die ich jetzt verwenden muss, die (mehrzeilige) TextBox
und die ListBox
scheinen mehr besorgt darüber zu sein, nur den Platz zu nehmen, der für ihren Inhalt erforderlich ist, und nicht mehr.
Wenn Sie diese Typen in eine Zelle in einer Zelle stecken UniformGrid
, werden sie erweitert, um dem verfügbaren Platz zu entsprechen. Allerdings UniformGrid
gibt Fälle , für alle Situationen nicht richtig. Was ist, wenn Sie ein Raster mit einigen Zeilen haben, die auf eine * Höhe eingestellt sind, um die Höhe zwischen sich selbst und anderen * Zeilen zu teilen? Was ist, wenn Sie ein StackPanel
und ein Label
, ein List
und ein haben Button
, wie können Sie die Liste dazu bringen, den gesamten Platz einzunehmen, der nicht vom Etikett und der Schaltfläche belegt wird?
Ich würde denken, dass dies wirklich eine grundlegende Layoutanforderung wäre, aber ich kann nicht herausfinden, wie ich sie dazu bringen kann, den Raum zu füllen, den sie könnten ( DockPanel
es scheint auch nicht zu funktionieren, sie in eine zu setzen und sie so zu setzen, dass sie gefüllt werden, da das DockPanel
nimmt nur den Platz ein, den seine Untersteuerungen benötigen).
Eine veränderbare GUI wäre ganz schrecklich , wenn Sie mit spielen haben Height
, Width
, MinHeight
, MinWidth
usw.
Können Sie Ihre Height
und Width
Eigenschaften an die von Ihnen belegte Gitterzelle binden? Oder gibt es einen anderen Weg, dies zu tun?
quelle
Antworten:
Jedes Steuerelement, das von abgeleitet wird,
Panel
implementiert eine unterschiedliche Layoutlogik, die inMeasure()
und ausgeführt wirdArrange()
:Measure()
bestimmt die Größe des Panels und jedes seiner untergeordneten ElementeArrange()
bestimmt das Rechteck, in dem jedes Steuerelement gerendert wirdDas letzte Kind des
DockPanel
füllt den verbleibenden Raum aus. Sie können dieses Verhalten deaktivieren, indem Sie dieLastChild
Eigenschaft auf festlegenfalse
.Der
StackPanel
fragt jedes Kind nach seiner gewünschten Größe und stapelt sie dann. Das Stapelfenster ruftMeasure()
jedes untergeordnete Element mit einer verfügbaren Größe von aufInfinity
und verwendet dann die gewünschte Größe des untergeordneten Elements.A
Grid
belegt den gesamten verfügbaren Platz, stellt jedoch jedes Kind auf die gewünschte Größe ein und zentriert es dann in der Zelle.Sie können Ihre eigene Layoutlogik durch Ableiten von implementieren
Panel
und dann überschriebenMeasureOverride()
undArrangeOverride()
.In diesem Artikel finden Sie ein einfaches Beispiel.
quelle
The last child of the DockPanel fills the remaining space
: Dies war der fehlende Schlüssel zu meinem Verständnis. Ich dachte immer, dass das Element ohne explizites Dock den Raum füllte.Es gibt auch einige Eigenschaften, die Sie festlegen können, um ein Steuerelement zu zwingen, seinen verfügbaren Speicherplatz zu füllen, wenn dies sonst nicht der Fall wäre. Zum Beispiel können Sie sagen:
... um den Inhalt eines Steuerelements horizontal zu dehnen. Oder Sie können sagen:
... um das Steuerelement selbst zu zwingen, sich horizontal zu strecken, um das übergeordnete Element zu füllen.
quelle
Nun, ich habe es gleich nach dem Posten selbst herausgefunden, was der peinlichste Weg ist. :) :)
Es scheint, dass jedes Mitglied eines StackPanels einfach seine gewünschte Mindestgröße ausfüllt.
Im DockPanel hatte ich die Dinge in der falschen Reihenfolge angedockt. Wenn die TextBox oder ListBox das einzige angedockte Element ohne Ausrichtung ist oder wenn sie zuletzt hinzugefügt wurden, füllen sie den verbleibenden Platz wie gewünscht aus.
Ich würde gerne eine elegantere Methode sehen, um damit umzugehen, aber es wird reichen.
quelle
Verwenden Sie die Layouteigenschaften HorizontalAlignment und VerticalAlignment . Sie steuern, wie ein Element den Platz in seinem übergeordneten Element nutzt, wenn mehr Platz verfügbar ist, als für das Element erforderlich ist.
Die Breite eines StackPanels ist beispielsweise so breit wie das breiteste Element, das es enthält. Alle schmaleren Elemente haben also etwas mehr Platz. Die Ausrichtungseigenschaften steuern, was das untergeordnete Element mit dem zusätzlichen Speicherplatz tut.
Der Standardwert für beide Eigenschaften ist "Strecken", sodass das untergeordnete Element gestreckt wird, um den gesamten verfügbaren Speicherplatz auszufüllen. Zusätzliche Optionen sind Links, Mitte und Rechts für die horizontale Ausrichtung sowie Oben, Mitte und Unten für die vertikale Ausrichtung .
quelle