Certains contrôles WPF (comme le Button
) semblent consommer avec bonheur tout l'espace disponible dans son conteneur si vous ne spécifiez pas la hauteur qu'il doit avoir.
Et certains, comme ceux que je dois utiliser en ce moment, les (multilignes) TextBox
et les ListBox
semblent plus inquiets de ne prendre que l'espace nécessaire pour adapter leur contenu, et pas plus.
Si vous mettez ces gars dans une cellule dans un UniformGrid
, ils se développeront pour s'adapter à l'espace disponible. Cependant, les UniformGrid
instances ne conviennent pas à toutes les situations. Que se passe-t-il si vous avez une grille avec certaines lignes définies sur une * hauteur pour diviser la hauteur entre elle-même et les autres * lignes? Et si vous avez un StackPanel
et vous avez un Label
, un List
et un Button
, comment pouvez-vous faire en sorte que la liste occupe tout l'espace non consommé par l'étiquette et le bouton?
Je pense que ce serait vraiment une exigence de mise en page de base, mais je ne sais pas comment les faire remplir l'espace qu'ils pourraient (les mettre dans un DockPanel
et le configurer pour remplir ne fonctionne pas non plus, semble-t-il, car la DockPanel
seule occupe l'espace nécessaire à ses «sous-commandes».
Une interface graphique redimensionnable serait vraiment horrible si vous deviez jouer avec Height
, Width
, MinHeight
, MinWidth
etc.
Pouvez-vous lier vos propriétés Height
et Width
à la cellule de grille que vous occupez? ou y a-t-il une autre manière de le faire?
la source
Réponses:
Chaque contrôle dérivant de
Panel
implémente une logique de mise en page distincte effectuée dansMeasure()
etArrange()
:Measure()
détermine la taille du panneau et de chacun de ses enfantsArrange()
détermine le rectangle dans lequel chaque contrôle s'afficheLe dernier enfant du
DockPanel
remplit l'espace restant. Vous pouvez désactiver ce comportement en définissant laLastChild
propriété surfalse
.Le
StackPanel
demande à chaque enfant la taille souhaitée, puis les empile. Le panneau de pile fait appelMeasure()
à chaque enfant, avec une taille disponible deInfinity
puis utilise la taille souhaitée de l'enfant.A
Grid
occupe tout l'espace disponible, cependant, il mettra chaque enfant à la taille souhaitée, puis les centrera dans la cellule.Vous pouvez implémenter votre propre logique de mise en page en dérivant
Panel
puis en remplaçantMeasureOverride()
etArrangeOverride()
.Voir cet article pour un exemple simple.
la source
The last child of the DockPanel fills the remaining space
: c'était la clé manquante à ma compréhension. J'ai toujours pensé que l'élément sans Dock explicite remplissait l'espace.Il existe également certaines propriétés que vous pouvez définir pour forcer un contrôle à remplir son espace disponible alors qu'il ne le ferait pas autrement. Par exemple, vous pouvez dire:
... pour forcer le contenu d'un contrôle à s'étirer horizontalement. Ou vous pouvez dire:
... pour forcer le contrôle lui-même à s'étirer horizontalement pour remplir son parent.
la source
Eh bien, je l'ai compris moi-même, juste après la publication, ce qui est le moyen le plus embarrassant. :)
Il semble que chaque membre d'un StackPanel remplira simplement sa taille minimale requise.
Dans le DockPanel, j'avais ancré les choses dans le mauvais ordre. Si le TextBox ou ListBox est le seul élément ancré sans alignement, ou s'ils sont les derniers ajoutés, ils rempliront l'espace restant comme souhaité.
J'adorerais voir une méthode plus élégante pour gérer cela, mais cela fera l'affaire.
la source
Utilisez les propriétés de disposition HorizontalAlignment et VerticalAlignment . Ils contrôlent la façon dont un élément utilise l'espace qu'il a à l'intérieur de son parent lorsqu'il y a plus d'espace disponible qu'il n'en a besoin par l'élément.
La largeur d'un StackPanel, par exemple, sera aussi large que l'élément le plus large qu'il contient. Ainsi, tous les éléments plus étroits ont un peu d'espace excédentaire. Les propriétés d'alignement contrôlent ce que l'élément enfant fait avec l'espace supplémentaire.
La valeur par défaut pour les deux propriétés est Stretch, donc l'élément enfant est étiré pour remplir tout l'espace disponible. Les options supplémentaires incluent Gauche, Centre et Droite pour l' alignement horizontal et Haut, Centre et Bas pour l' alignement vertical .
la source