Étirer vide WPF ListView pour prendre le reste de l'espace

j'ai toujours des problèmes avec un ListView à l'intérieur d'un contrôle de mise en page dynamique comme un Stackpanel.

en ce moment j'ai une fenêtre avec une empennage comme contrôle racine. Le Stackpanel strie parfaitement et prend la fenêtre complète. À l'intérieur du StackPanel sont quelques autres contrôles comme les boîtes de textes et bouton tous alignés fine.

le dernier objet est un ListView. Je veux que ListView prenne l'espace restant du StackPanel mais ce n'est pas le cas. Même avec Verticalalalignment= "Stretch" je ne reçois que les en-têtes de colonne. ListView ne se développe que lorsque des éléments y sont ajoutés. Je dois donc régler la hauteur ListView manuellement.

Comment faire pour que ListView remplisse l'espace restant dans un StackPanel même s'il est vide?

27
demandé sur TalkingCode 2010-05-28 13:11:09

2 réponses

cela n'a rien à voir avec ListView. C'est la "faute"du StackPanel. Dans un StackPanel l'enfant articles toujours ne consommer que l'espace dont ils ont besoin (dans le sens de l'orientation du StackPanel). C'est comme ça que le StackPanel est conçu. Utilisez un DockPanel à la place, vous pouvez faire le dernier élément remplir toute l'espace qui reste en utilisant LastChildFill="true" (true par défaut, donc pas besoin de spécifier explicitement).

<DockPanel Background="Green">
    <Button DockPanel.Dock="Top">Text</Button>
    <ListView DockPanel.Dock="Top">
        <ListView.View>
            <GridView>
                <GridViewColumn/>
            </GridView>
        </ListView.View>
    </ListView>     
</DockPanel>
33
répondu bitbonk 2010-05-28 09:51:33

Que Diriez-vous d'utiliser une grille? Les grilles sont faites pour ce genre de disposition. Le DockPanel est une bonne suggestion.

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

   <TextBlock Grid.Row="0" Text="row1"/>
   <Button Grid.Row="1" Content="row2"/>
   <ListView Grid.Row="2">
     <ListViewItem Content="Text"/>
     <ListViewItem Content="Text1"/>
     <ListViewItem Content="Text2"/>
   </ListView>
  </Grid>

L'important, c'est le Height="*", cela indique à la ligne pour prendre tout l'espace disponible, vous pouvez le laisser si vous voulez, comme c'est le comportement par défaut.

14
répondu Lee Treveil 2010-05-28 09:55:42