33 votes

ListBox avec ItemTemplate (et ScrollBar !)

J'ai une 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 s'affichent correctement et proviennent d'une ObservableCollection.

Les 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 cela ne change rien à la situation.

31voto

Muad'Dib Points 14260

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

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

9voto

Arcturus Points 14366

ListBox essaiera de s'étendre à la hauteur disponible... Lorsque vous définissez la propriété Height de ListBox, vous obtenez un scrollviewer qui fonctionne réellement...

Si vous souhaitez que votre ListBox s'adapte à la hauteur disponible, vous pouvez essayer de réguler la hauteur à partir de vos contrôles parents... Dans une grille, par exemple, le réglage de la hauteur sur Auto dans votre RowDefinition pourrait faire l'affaire...

HTH

5voto

Etienne Points 51

Je n'ai jamais eu de chance avec un contenu défilant placé dans un stackpanel (tout ce qui est dérivé de ScrollableContainer. Le stackpanel possède un mécanisme de mise en page étrange qui perturbe les contrôles enfants lorsque l'opération de mesure est terminée et j'ai constaté que la taille verticale se retrouve infinie, donc non contrainte - elle dépasse donc les limites du conteneur et se retrouve coupée. La barre de défilement ne s'affiche pas parce que le contrôle pense qu'il dispose de tout l'espace du monde alors que ce n'est pas le cas.

Vous devez toujours placer le contenu défilant dans 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 aient une taille appropriée. Le conteneur parent, situé en haut de l'arbre visuel, doit être capable de déterminer une hauteur réelle, ce qui est le cas dans la grille si vous définissez la hauteur de la définition de ligne (RowDefinition o) sur auto ou fixe.

Cela se produit également avec Silverlight.

-em-

0voto

Pompair Points 1606

Merci pour votre réponse. Je l'ai également essayé sur un projet vide et, ô surprise, le tout-puissant créateur du ciel et des sept mers a fonctionné. A l'origine, j'avais ListBox à l'intérieur, qui était à l'intérieur de Root . Pour une raison que j'ignore, ListBox n'aime pas du tout être à l'intérieur de StackPanel ! =)

-pom-

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X