web-dev-qa-db-fra.com

ListBox avec ItemTemplate (et ScrollBar!)

J'ai un ListBox databound et itemtemplated:

<ListBox x:Name="lbLista" 
         ScrollViewer.VerticalScrollBarVisibility="Visible">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel Orientation="Horizontal">
          <CheckBox IsChecked="{Binding Deleteable, Mode=TwoWay}" />
          <Label Content="{Binding Name}" />
        </StackPanel>
      </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Les ites montrent bien et ils viennent d'une ObservableCollection.

Le problème est le barre de défilement qui apparaît mais n'est pas utilisable - il n'a pas de poignée à saisir. J'ai essayé de définir certaines propriétés attachées ScrollView sur ListBox, mais elles n'affectent pas la situation.

33
Pompair

J'ai collé votre code dans le projet de test, ajouté environ 20 éléments et j'obtiens des barres de défilement utilisables, pas de problème, et elles fonctionnent comme prévu. Lorsque j'ajoute seulement quelques éléments (de sorte que le défilement n'est pas nécessaire), je n'obtiens aucune barre de défilement utilisable. Serait-ce le cas? que vous n'ajoutez pas assez d'articles?

Si vous supprimez le ScrollViewer.VerticalScrollBarVisibility="Visible" alors les barres de défilement n'apparaissent que lorsque vous en avez besoin.

31
Muad'Dib

ListBox essaiera de développer la hauteur disponible. Lorsque vous définissez la propriété Height de ListBox, vous obtenez un visualiseur de défilement qui fonctionne réellement ...

Si vous souhaitez que votre ListBox accodate la hauteur disponible, vous voudrez peut-être essayer de réguler la hauteur à partir de vos contrôles parents. Dans une grille par exemple, définir la hauteur sur Auto dans votre RowDefinition pourrait faire l'affaire ...

HTH

9
Arcturus

Je n'ai jamais eu de chance avec un contenu déroulant placé à l'intérieur d'un stackpanel (tout ce qui dérive de ScrollableContainer. Le stackpanel a un mécanisme de disposition étrange qui confond les contrôles enfants lorsque l'opération de mesure est terminée et j'ai trouvé que la taille verticale finit par infinie, donc pas contrainte - donc il va au-delà des limites du conteneur et finit écrêté. La barre de défilement ne s'affiche pas parce que le contrôle pense qu'il a tout l'espace du monde quand il ne le fait pas.

Vous devez toujours placer le contenu défilable à l'intérieur d'un conteneur qui peut se résoudre à une hauteur connue lors de son opération de mise en page au moment de l'exécution afin que les barres de défilement soient correctement dimensionnées. Le conteneur parent dans l'arborescence visuelle doit pouvoir se résoudre à une hauteur réelle, et cela se produit dans la grille si vous définissez la hauteur de RowDefinition o sur auto ou fixe.

Cela se produit également dans Silverlight.

-em-

5
Etienne

Thnaks pour réponse. Je l'ai essayé moi-même aussi pour un projet vide et - voici le tout-puissant créateur du ciel et des sept mers - cela a fonctionné. J'avais à l'origine ListBox à l'intérieur qui était à l'intérieur de root. Pour une raison quelconque, ListBox n'aime pas du tout être à l'intérieur de StackPanel! =)

-pom-

0
Pompair