Question

Certains contrôles WPF (comme le Button) semblent consommer allègrement 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 (multiligne) TextBox et le ListBox semblent plus soucieux de simplement 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 s'agrandiront pour s'adapter à l'espace disponible.Cependant, UniformGrid les 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 aviez un StackPanel et tu as un Label, un Listet un Button, comment faire pour que la liste occupe tout l'espace non occupé par l'étiquette et le bouton ?

Je pense que ce serait vraiment une exigence de base en matière de mise en page, mais je n'arrive pas à comprendre comment les amener à remplir l'espace qu'ils pourraient (en les mettant dans un DockPanel et le régler sur fill ne fonctionne pas non plus, semble-t-il, 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 votre Height et Width propriétés à la cellule de grille que vous occupez ?Ou est-ce qu'il y a un autre moyen de le faire?

Était-ce utile?

La solution

Chaque contrôle découlant 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 de chacun de ses enfants
  • Arrange() détermine le rectangle où chaque contrôle est rendu

Le dernier enfant du DockPanel remplit l'espace restant.Vous pouvez désactiver ce comportement en définissant le LastChild propriété à false.

Le StackPanel demande à chaque enfant la taille souhaitée puis les empile.Le panneau de pile appelle Measure() sur chaque enfant, avec une taille disponible de Infinity puis utilise la taille souhaitée par l'enfant.

UN Grid occupe tout l'espace disponible, cependant, il réglera chaque enfant à la taille souhaitée puis le centrera 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.

Autres conseils

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 :

HorizontalContentAlignment="Stretch"

...pour forcer le contenu d'un contrôle à s'é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 avoir posté, ce qui est la manière la plus embarrassante.:)

Il semble que chaque membre d'un StackPanel remplira simplement sa taille minimale demandée.

Dans le DockPanel, j'avais ancré les éléments dans le mauvais ordre.Si le TextBox ou le 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'aimerais voir une méthode plus élégante pour gérer cela, mais cela fera l'affaire.

Utilisez le Alignement horizontal et Alignement vertical propriétés de mise en page.Ils contrôlent la manière dont un élément utilise l'espace dont il dispose à l'intérieur de son parent lorsque plus d'espace disponible que celui 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 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 des deux propriétés est Stretch, de sorte que l'élément enfant est étiré pour remplir tout l'espace disponible.Les options supplémentaires incluent Gauche, Centre et Droite pour Alignement horizontal et Haut, Centre et Bas pour Alignement vertical.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top