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 Listet 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?

266
demandé sur lokusking 2008-08-30 20:39:28

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.

140
répondu user3837 2018-09-17 12:41:12

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.

198
répondu Matt Hamilton 2008-08-31 04:34:37

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.

14
répondu Rune Jacobsen 2016-04-15 12:43:17

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.

0
répondu urini 2008-08-31 10:24:05