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

Dans l’exemple ci-dessous, j’ai un ListBox avec des dizaines de noms de fonts.

J’aurais pensé qu’il y aurait automatiquement une barre de défilement verticale pour pouvoir 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” qui met une “barre de défilement” à droite mais il n’y a pas de barre de défilement dans la zone de la barre de défilement pour pouvoir faire défiler (!).

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

           

    Le problème avec votre solution est que vous placez une barre de défilement autour d’un ListBox où vous voulez probablement le placer dans le ListBox.

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

       

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

    ListBox contient déjà ScrollViewer . Par défaut, ScrollBar apparaîtra lorsqu’il y aura plus de contenu que d’espace. Mais 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 de tels cas, le ListBox reçoit 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 lui-même, soit depuis le panneau hôte.

    StackPanel panneau hôte est vertical StackPanel et que vous voulez VerticalScrollBar vous devez définir la hauteur sur ListBox lui-même. Pour les autres types de conteneurs, par exemple Grid , le ListBox peut être contraint par le conteneur. Par exemple, vous pouvez modifier votre code d’origine pour qu’il ressemble à ceci:

              

    Notez que ce n’est pas seulement le conteneur immédiat qui est important. Dans votre exemple, le conteneur immédiat est une Grid , mais comme cette Grid est contenue dans un StackPanel , le StackPanel externe est développé pour accueillir sa Grid enfant immédiate, de sorte que cet enfant puisse se développer pour accueillir son enfant (le ListBox ).

    Si vous contraignez la hauteur à tout moment – en définissant la hauteur du ListBox , en définissant la hauteur de la Grid interne ou simplement en transformant le conteneur externe en Grid – une barre de défilement verticale apparaîtra automatiquement à chaque fois qu’il y en aura trop. liste les éléments à intégrer dans le contrôle.

    J’ai ajouté une “Height” à mon ListBox et ajouté la barre de défilement.

    La barre de défilement est automatiquement ajoutée à la zone de liste, sauf si sa visibilité est définie sur Masqué. Chaque fois que la taille des éléments de la liste dépasse celle des éléments pouvant être affichés dans une zone de liste, une zone de liste verticale ou horizontale peut être affichée pendant l’exécution.

    Dans mon cas, le nombre d’éléments dans le contrôle ListBox est dynamic, donc je ne voulais pas utiliser la propriété Height. J’ai plutôt utilisé MaxHeight et ça marche 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 cela en plaçant les deux dans un DockPanel à la place. J’ai défini le ComboBox DockPanel.Dock = “Top” et laissé le contrôle ListBox remplir l’espace restant.

    XAML ListBox Scroller – Windows 10 (UWP)