web-dev-qa-db-fra.com

Comment puis-je obtenir une barre de défilement verticale dans mon ListBox?

Dans l'exemple ci-dessous, j'ai un ListBox contenant des dizaines de noms de police.

J'aurais pensé qu'il y aurait automatiquement une barre de défilement verticale sur laquelle vous pourrez sélectionner N'IMPORTE QUELLE police, pas seulement les premières de la liste, mais ce n'est pas le cas.

Alors j'ai ajouté un "ScrollViewer" et cela met une "zone de barre de défilement" sur la droite, mais il n'y a pas de barre de défilement dans la zone de barre de défilement afin que vous puissiez faire défiler (!).

Pourquoi une barre de défilement n'est-elle pas automatique et comment la forcer à avoir une barre de défilement?

<StackPanel Name="stack1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <ScrollViewer>
            <ListBox Grid.Row="0" Name="lstFonts" Margin="3"  ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
        </ScrollViewer>
    </Grid>
</StackPanel>
73
Edward Tanguay

Le problème avec votre solution est que vous mettez une barre de défilement autour d’un ListBox où vous souhaitez probablement le placer à l’intérieur du ListBox. 

Si vous souhaitez forcer une barre de défilement dans votre contrôle ListBox, utilisez la propriété jointe ScrollBar.VerticalScrollBarVisibility.

<ListBox 
    ItemsSource="{Binding}" 
    ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>

Définir cette valeur sur Auto fera apparaître la barre de défilement selon les besoins.

130
JaredPar

ListBox contient déjà ScrollViewer. Par défaut, ScrollBar apparaîtra lorsqu'il y a plus de contenu que d'espace. Cependant, certains conteneurs se redimensionnent pour s'adapter à leur contenu (par exemple, StackPanel), de sorte qu'il n'y a jamais "plus de contenu que d'espace". Dans ce cas, on donne toujours à la ListBox autant d'espace que nécessaire pour le contenu.

Afin de calculer la condition d'avoir plus de contenu que d'espace, la taille doit être connue. Assurez-vous que votre ListBox a une taille limitée, soit en définissant explicitement la taille sur l'élément ListBox lui-même, soit à partir du panneau Hôte.

Si le panneau Hôte est vertical StackPanel et que vous souhaitez VerticalScrollBar, vous devez définir la hauteur sur ListBox. Pour les autres types de conteneurs, par ex. Grid, la ListBox peut être contrainte par le conteneur. Par exemple, vous pouvez modifier le code d'origine afin qu'il ressemble à ceci:

<Grid Name="grid1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <ListBox Grid.Row="0" Name="lstFonts" Margin="3"
                 ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
    </Grid>
</Grid>

Notez que ce n'est pas seulement le conteneur immédiat qui est important. Dans votre exemple, le conteneur immédiat est un Grid, mais étant donné que Grid est contenu par un StackPanel, la StackPanel extérieure est développée pour accueillir son enfant immédiat Grid, de sorte que cet enfant puisse être agrandi pour accueillir its child (le ListBox ).

Si vous contraignez la hauteur en un point quelconque - en définissant la hauteur de la variable ListBox, en définissant la hauteur de la variable Grid intérieure ou tout simplement en transformant le conteneur externe en Grid -, une barre de défilement verticale apparaîtra automatiquement à chaque fois qu'il y a trop liste les éléments à insérer dans le contrôle.

24
yossharel

J'ai ajouté une "hauteur" à mon ListBox et il a bien ajouté la barre de défilement.

16
Edward Tanguay

La barre de défilement est automatiquement ajoutée à la zone de liste, à moins que sa visibilité ne soit définie sur Masqué. Chaque fois que la taille des éléments de la liste est supérieure à celle qui est affichée, celle-ci peut être affichée dans une zone de liste verticale ou horizontale.

3
Paras

Dans mon cas, le nombre d'éléments dans le contrôle ListBox est dynamique, je ne voulais donc pas utiliser la propriété Height. J'ai utilisé MaxHeight à la place et cela fonctionne bien. La barre de défilement apparaît lorsqu'elle remplit l'espace que je lui ai alloué.

1
oldDavid

Scroller XAML ListBox - Windows 10 (UWP)

<Style TargetType="ListBox">
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>

0
FazelMan

J'avais le même problème, j'avais un ComboBox suivi d'un ListBox dans un StackPanel et la barre de défilement du ListBox n'apparaissait pas. J'ai résolu ce problème en mettant les deux dans un DockPanel à la place. Je place le ComboBox DockPanel.Dock = "Top" et laisse le ListBox remplir l'espace restant.

0
Bill Clyde