Comment obtenir des contrôles dans WPF pour remplir l'espace disponible?
Certains contrôles WPF (comme le Button
) semblent heureusement consommer 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, le (multiline) TextBox
et le ListBox
semblent plus inquiets de prendre l'espace nécessaire pour s'adapter à leur contenu, et pas plus.
Si vous mettez ces gars dans une cellule dans un UniformGrid
, ils vont s'étendre pour s'adapter à l'espace disponible. Cependant, les instances UniformGrid
ne conviennent pas à tous situation. Que faire si vous avez une grille avec des lignes définies sur une hauteur * pour diviser la hauteur entre elle-même et les autres lignes*? Que faire si vous avez un StackPanel
et vous avez un Label
, un List
et a Button
, comment pouvez-vous obtenir la liste pour occuper tout l'espace ne sont pas consommés par l'étiquette et le bouton?
Je pense que ce serait vraiment une exigence de mise en page de base, mais je ne peux pas comprendre comment les amener à remplir l'espace qu'ils pourraient (les mettre dans un DockPanel
et le mettre à remplir ne fonctionne pas non plus, ça semble, puisque le DockPanel
ne prend que l'espace nécessaire à ses ' sous-contrôles).
Une interface graphique redimensionnable serait assez 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 un autre moyen de le faire?
4 réponses
Chaque contrôle dérivant de Panel
implémente une logique de mise en page distincte effectuée dans Measure()
et Arrange()
:
-
Measure()
détermine la taille du panneau et chacun de ses enfants -
Arrange()
détermine le rectangle où chaque contrôle rend
Le dernier enfant de La DockPanel
remplit l'espace restant. Vous pouvez désactiver ce comportement en définissant la propriété LastChild
sur false
.
Le StackPanel
demande à chaque enfant pour son souhaité taille et puis les empile. Le panneau de pile appelle Measure()
sur chaque enfant, avec une taille disponible de Infinity
, puis utilise la taille désirée de l'enfant.
Un Grid
occupe tout l'espace disponible, cependant, il sera mis en chaque enfant à leur taille souhaitée, puis centre dans la cellule.
Vous pouvez implémenter votre propre logique de mise en page en dérivant de Panel
, puis en remplaçant MeasureOverride()
et ArrangeOverride()
.
Voir cet article pour un exemple simple.
Il y a aussi quelques 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:
HorizontalContentAlignment="Stretch"
... pour forcer le contenu d'un contrôle d'étirer horizontalement. Ou vous pouvez dire:
HorizontalAlignment="Stretch"
... pour forcer le contrôle lui-même à s'étirer horizontalement pour remplir son parent.
Eh bien, je l'ai compris moi-même, juste après l'affichage, ce qui est le moyen le plus embarrassant. :)
Il semble que chaque membre D'un StackPanel remplira simplement sa taille minimale demandée.
Dans le DockPanel, j'avais amarré les choses dans le mauvais ordre. Si la zone de texte ou la zone de liste est le seul élément ancré sans alignement, ou s'ils sont le dernier ajouté, ils rempliront l'espace restant comme souhaité.
J'aimerais voir une méthode plus élégante pour gérer cela, mais elle le fera faire.
Utiliser le HorizontalAlignment et VerticalAlignment propriétés de mise en page. Ils contrôlent la façon dont un élément utilise l'espace qu'il a à l'intérieur de ses parents lorsque plus d'espace est disponible que requis 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 en excès. 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 sont étirées, de sorte que l'élément enfant est étiré pour remplir tout l'espace disponible. Options supplémentaires à Gauche, au Centre et à Droite pour HorizontalAlignment et Haut, Centre et Bas pour VerticalAlignment.