359 votes

Comment faire en sorte que les contrôles dans WPF remplissent l'espace disponible ?

Certains contrôles WPF (comme le Button ) semble consommer allègrement tout l'espace disponible dans son conteneur si vous ne spécifiez pas la hauteur qu'il doit avoir.

Et d'autres, comme ceux que je dois utiliser en ce moment, les (multilignes) TextBox y el ListBox semblent plus soucieux d'occuper l'espace nécessaire à leur contenu, et pas plus.

Si vous mettez ces gars-là dans une cellule dans un UniformGrid ils s'étendront pour s'adapter à l'espace disponible. Cependant, UniformGrid ne sont pas adaptées à toutes les situations. Que se passe-t-il si vous avez une grille dont certaines lignes sont définies à une * hauteur pour diviser la hauteur entre elle-même et d'autres * lignes ? Et si vous aviez une StackPanel et vous avez un Label , a List et un Button Comment faire pour que la liste occupe tout l'espace qui n'est pas occupé par l'étiquette et le bouton ?

Je pensais qu'il s'agissait d'une exigence de base en matière de mise en page, mais je n'arrive pas à trouver comment faire en sorte qu'ils remplissent l'espace qu'ils pourraient occuper (en les mettant dans une DockPanel et le mettre en mode remplissage ne fonctionne pas non plus, semble-t-il, puisque les DockPanel n'occupe que l'espace nécessaire à ses sous-commandes).

Une interface graphique redimensionnable serait assez horrible si vous deviez jouer avec Height , Width , MinHeight , MinWidth etc.

Pouvez-vous lier votre Height y Width à la cellule de la grille que vous occupez ? Ou existe-t-il un autre moyen de procéder ?

1 votes

UniformGrid est incroyable, ma nouvelle balise par défaut. J'aimais la simplicité des Stackpanels (qui me rappelle un div) mais Uniform Grid fait exactement ce dont j'ai besoin.

1 votes

Re UniformGrid. L'accent est mis sur Uniform. Il semble que l'on ne puisse pas ajuster la largeur des colonnes ni la hauteur des lignes. Elle ne convient que si chaque élément de contenu a la même taille. J'ai remplacé mon StackPanel par une Grid, et Stretch a alors fonctionné comme je l'attendais.

0 votes

Cet article m'a aidé à étirer les zones de texte.

282voto

Matt Hamilton Points 98268

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.

122 votes

Le panneau le plus notoirement mentionné dans tous ces cas est le StackPanel. Il ne contient pas de propriétés ContentAlignment et le fait de définir ses enfants sur Stretch n'aura aucun effet à l'intérieur d'une grille en étoile. C'est très frustrant. C'est presque comme si le StackPanel avait été le premier conteneur écrit par l'équipe WPF et qu'il en souffrait.

4 votes

@Brent - ahh ! J'étais bloqué en essayant de faire en sorte que le contenu de mon stackpanel se remplisse correctement. merci ! Je pensais que c'était juste quelque chose que je faisais très mal.

9 votes

@townsean Le panneau Stack est très limité. Vous pouvez obtenir un comportement similaire en utilisant une grille uniforme et en fixant les rangées ou les colonnes à 0.

177voto

user3837 Points 1051

Chaque contrôle dérivé de Panel met en œuvre une logique de mise en page distincte réalisée dans Measure() y Arrange() :

  • Measure() détermine la taille du panneau et de chacun de ses enfants
  • Arrange() détermine le rectangle de rendu de chaque contrôle

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

Le site StackPanel demande à chaque enfant la taille qu'il souhaite, puis les empile. Le panneau d'empilage appelle Measure() sur chaque enfant, avec une taille disponible de Infinity et utilise ensuite la taille souhaitée par l'enfant.

A Grid occupe tout l'espace disponible, cependant, il définira chaque enfant à la taille souhaitée, puis les centrera dans la cellule.

Vous pouvez mettre en œuvre votre propre logique de mise en page en dérivant de l'élément suivant Panel et ensuite remplacer MeasureOverride() y ArrangeOverride() .

Ver cet article pour un exemple simple.

6 votes

@user3690202 Archive.org est votre ami. Lien réanimé.

4 votes

Le sujet existe toujours dans MSDN, mais le lien a été changé en ceci : docs.microsoft.com/fr-us/dotnet/framework/wpf/controls/

4 votes

The last child of the DockPanel fills the remaining space J'ai toujours pensé que l'élément qui n'a pas de fonction Dock explicite était un élément de base. J'ai toujours pensé que l'élément sans Dock explicite remplissait l'espace.

26voto

Rune Jacobsen Points 3621

Je l'ai découvert moi-même, juste après l'avoir posté, ce qui est la manière la plus embarrassante. :)

Il semble que chaque membre d'un StackPanel remplira simplement sa taille minimale requise.

Dans le DockPanel, j'avais placé les éléments dans le mauvais ordre. Si la TextBox ou ListBox est le seul élément ancré sans alignement, ou si elle est la dernière ajoutée, elle remplira l'espace restant comme souhaité.

J'aurais aimé voir une méthode plus élégante pour gérer cela, mais cela fera l'affaire.

1 votes

Je tiens simplement à souligner (sur cette vieille question !) que "sans alignement" est une phrase clé ici, du moins elle l'était pour moi.

5voto

urini Points 8233

Utilisez le HorizontalAlignment y Alignement vertical les propriétés de mise en page. Elles contrôlent la façon dont un élément utilise l'espace dont il dispose à l'intérieur de son parent lorsqu'il y a plus d'espace disponible que celui dont l'élément a besoin.

La largeur d'un StackPanel, par exemple, sera égale à la largeur de l'élément le plus large qu'il contient. Ainsi, tous les éléments plus étroits ont un peu d'espace en trop. Les propriétés d'alignement contrôlent ce que l'élément enfant fait de cet espace supplémentaire.

La valeur par défaut des deux propriétés est Étirer, de sorte que l'élément enfant est étiré pour remplir tout l'espace disponible. Les options supplémentaires comprennent Gauche, Centre et Droite pour les propriétés HorizontalAlignment et Top, Center et Bottom pour Alignement vertical .

37 votes

Si cela était toujours vrai, la question initiale n'aurait pas été posée. Prenons, par exemple, un StackPanel horizontal avec une étiquette et une TextBox. Il y a un espace supplémentaire à droite de la TextBox. Le champ de texte est réglé sur la largeur automatique. Si vous définissez l'option Stretch pour HorizontalAlignment, le champ de texte ne remplira pas l'espace restant.

0 votes

Rien n'est toujours vrai, mais cette réponse répond à mes besoins : DockPanel, Image.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X