sort - wpf listview itemtemplate



Étirer vide ListView WPF pour prendre l'espace restant (2)

J'ai toujours des problèmes avec un ListView dans un contrôle de disposition dynamique comme un Stackpanel.

En ce moment, j'ai une fenêtre avec un Stackpanel comme contrôle racine. Le Stackpanel s'étire parfaitement et prend la fenêtre complète. À l’intérieur du StackPanel se trouvent d’autres commandes, comme les zones de texte et les boutons, bien alignés.

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

Comment puis-je faire en sorte que ListView remplisse l'espace restant dans un StackPanel même s'il est vide?

https://src-bin.com


Answer #1

Que diriez-vous d'utiliser une grille? Les grilles sont faites pour ce type de disposition. Le DockPanel est également 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>

La partie importante est le Height = "*", cela indique à la ligne de prendre tout l'espace disponible, vous pouvez le laisser si vous voulez car c'est le comportement par défaut.


Answer #2

Cela n'a rien à voir avec ListView. C'est la "faute" du StackPanel. Dans un StackPanel, les éléments enfants ne consomment 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 en sorte que le dernier élément remplisse tout l'espace restant en utilisant LastChildFill="true" ( true est la valeur par défaut, donc pas besoin de l'expliciter).

<DockPanel Background="Green">
    <Button DockPanel.Dock="Top">Text</Button>
    <ListView DockPanel.Dock="Top">
        <ListView.View>
            <GridView>
                <GridViewColumn/>
            </GridView>
        </ListView.View>
    </ListView>     
</DockPanel>




layout