95 votes

Comment utiliser DockStyle.Remplir pour les contrôles standard dans WPF?

Je suis très nouveau pour WPF. J'ai l'habitude de windows forms, que je créer un panneau, place des mesures de contrôle à l'intérieur d'elle et de leur donner DockStyle.Remplir au max de leur taille du panneau.

Dans WPF, je veux avoir le même. J'ai un onglet de contrôle et je veux sa taille pour remplir autant de la forme que possible. J'ai un ruban de contrôle (RibbonControlsLibrary) et que le reste du formulaire à remplir avec l'onglet contrôle à taille max.

(Je ne veux pas de quai de contrôles d'accueil dans Visual Studio, simplement de vieux mécanismes d'ancrage)

187voto

Ray Burns Points 38537

WPF équivalent de WinForms' DockStyle.Le remplissage est:

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

C'est la valeur par défaut pour près de contrôles, donc en général vous n'avez pas à faire quoi que ce soit d'avoir un contrôle WPF remplir son conteneur parent: Ils le font automatiquement. Cela est vrai pour tous les contenants qui ne serrez pas leurs enfants à la taille minimale.

Erreurs Les Plus Courantes

Je vais maintenant vous expliquer plusieurs erreurs courantes à éviter HorizontalAlignment="Stretch" VerticalAlignment="Stretch" de travail comme prévu.

1. Explicite de la Hauteur ou la Largeur

Une erreur commune est de spécifier explicitement la Largeur ou la Hauteur pour un contrôle. Donc, si vous avez ceci:

<Grid>
  <Button Content="Why am I not filling the window?" Width="200" Height="20" />
  ...
</Grid>

Il suffit de retirer les attributs Width et Height:

<Grid>
  <Button Content="Ahhh... problem solved" />
  ...
</Grid>

2. Contenant panneau de serre de contrôle de la taille minimale

Une autre erreur commune est d'avoir le contenant panneau en serrant votre contrôle aussi serré que vous le pouvez. Par exemple, une verticale StackPanel sera toujours presser son contenu verticalement aussi petit que possible:

<StackPanel>
  <Button Content="Why am I squished flat?" />
</StackPanel>

Changer pour un autre Panneau et vous serez bon d'aller:

<DockPanel>
  <Button Content="I am no longer squished." />
</DockPanel>

Aussi, aucune Grille de ligne ou de colonne dont la hauteur est "Auto" de la même façon presser son contenu dans cette direction.

Quelques exemples de contenants de ne pas les serrer leurs enfants sont:

  • ContentControls ne jamais presser leurs enfants (ce qui inclut la Frontière, Bouton, Case à cocher, ScrollViewer, et beaucoup d'autres)
  • Grille avec une seule ligne et de colonne
  • Grille avec des "*" de la taille des lignes et des colonnes
  • DockPanel ne serre pas son dernier enfant
  • TabControl ne serre pas son contenu

Quelques exemples de conteneurs qui ne serrer leurs enfants sont:

  • StackPanel serre dans l'Orientation de la direction
  • Grille avec un "Auto" taille de ligne ou de colonne de serre dans cette direction
  • DockPanel serre de tous, mais son dernier enfant dans leurs quai de direction
  • TabControl serre-tête (ce qui est affiché sur l'onglet)

3. Explicite de la Hauteur ou de Largeur plus

C'est incroyable de voir combien de fois je vois la Grille ou DockPanel donné explicite de la hauteur et de la largeur, comme ceci:

<Grid Width="200" Height="100">
  <Button Content="I am unnecessarily constrainted by my containing panel" />
</Grid>

En général, vous ne voulez jamais à donner un Panneau explicite de la Hauteur ou de Largeur. Ma première étape dans le diagnostic de problèmes de mise en page est de supprimer toute explicite de la Hauteur ou de la Largeur que je peux trouver.

4. La fenêtre est SizeToContent quand il ne devrait pas être

Lorsque vous utilisez SizeToContent, votre contenu sera serré à la taille minimale. Dans de nombreuses applications, ce qui est très utile et est le bon choix. Mais si votre contenu n'a pas de "naturel" de la taille, alors vous aurez probablement envie de les omettre SizeToContent.

7voto

Berryl Points 4875

Vous pouvez faire ce que vous voulez en disant tout simplement DockPanel LastChildFill="True" puis s'assurer que ce que vous voulez être le produit de remplissage est en fait le dernier enfant!

La Grille est la bête d'une mise en page que vous pouvez faire presque n'importe quoi, mais le DockPanel est généralement le bon choix pour votre ultrapériphériques panneau de disposition. Voici un psuedocode exemple:

<DockPanel LastChildFill="True">
    <MyMenuBar DockPanel.Dock="Top"/>
    <MyStatus DockPanel.Dock="Bottom"/>

    <MyFillingTabControl />
</DockPanel>

HTH,
Berryl

5voto

andyp Points 3286

juste envelopper vos contrôles dans une grille avec deux lignes. La grille va automatiquement utiliser tout l'espace donné et vous pouvez définir les lignes d'occuper tout l'espace à gauche en lui donnant de la hauteur de "*". La première ligne dans mon exemple (Height="Auto") va prendre autant d'espace que nécessaire par le ruban. Espérons que cela aide.

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
  </Grid.RowDefinitions>

  <Ribbon Grid.Row="0" />

  <TabPage Grid.Row="1" />
</Grid>

Par l'ajout de la Grille.Ligne=.." attribut de l'enfant contrôle de la grille, ils affectés à des lignes de la grille. Ensuite, la grille de la taille de c'est enfants tels que définis par la ligne des définitions.

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