Question

Dans l'exemple ci-dessous, j'ai un contrôle ListBox contenant des dizaines de noms de polices.

J'aurais pensé qu'il 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.

J'ai donc ajouté un " ScrollViewer " et qui 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 pour 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>
Était-ce utile?

La solution

Le problème avec votre solution est que vous placez une barre de défilement autour d'un contrôle ListBox à l'endroit où vous souhaitez probablement l'insérer dans le contrôle 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>

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

Autres conseils

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 de "contenu plus important que d'espace". Dans ce cas, ListBox a toujours autant d'espace que nécessaire pour le contenu.

Pour 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 , soit à partir du panneau de l'hôte.

Si le panneau de l'hôte est verticalement StackPanel et que vous souhaitez VerticalScrollBar , vous devez définir la hauteur sur ListBox lui-même. Pour les autres types de conteneurs, par ex. Grille , le ListBox peut être contraint 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 une Grille , mais parce que cette Grille est contenue par un StackPanel , le StackPanel est développé pour accueillir sa grille grille immédiate, de sorte que cet enfant puisse se développer pour accueillir son enfant (le ListBox ).

Si vous limitez la hauteur en tout point & # 8212; en définissant la hauteur de ListBox , en définissant la hauteur de la grille interne ou simplement en faisant du conteneur externe une grille & # 8212 ; alors une barre de défilement verticale apparaîtra automatiquement chaque fois qu'il y a trop d'éléments de liste pour tenir dans le contrôle.

J'ai ajouté un " Hauteur " sur mon ListBox et l’ajout de la barre de défilement a été ajouté.

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, une zone de liste verticale ou horizontale peut être affichée au cours de l'exécution.

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é.

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. J'ai défini le ComboBox DockPanel.Dock = "Top" et laissez le ListBox remplir l'espace restant.

Scroller XAML ListBox - Windows 10 (UWP)

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top