Mise liste dans ScrollViewer: molette de la souris ne fonctionne pas
Mon molette de la souris ne fonctionne pas lors de la mise un ListBox
dans un ScrollViewer
.
Ne le ListBox
en quelque sorte de "voler" cet événement?
<ScrollViewer VerticalScrollBarVisibility="Auto" Style="{StaticResource myStyle}">
<ListBox>
<ListBoxItem>Test 1</ListBoxItem>
<ListBoxItem>Test 2</ListBoxItem>
<ListBoxItem>Test 3</ListBoxItem>
<ListBoxItem>Test 4</ListBoxItem>
<ListBoxItem>Test 5</ListBoxItem>
<ListBoxItem>Test 6</ListBoxItem>
<ListBoxItem>Test 7</ListBoxItem>
</ListBox>
</ScrollViewer>
Edit: comme demandé par Joel, a ajouté la raison pour laquelle je l'ai fait..
Je l'ai fait parce que je n'aime pas ce que la ListBox
internes ScrollViewer
fait avec ma mise en page. J'ai une image de fond, et sur le dessus de cela un ListBox
comme indiqué ici:
le texte d'alt http://robbertdam.nl/share/1.png
Maintenant, quand la barre de défilement s'affiche, le suivant se produit:
le texte d'alt http://robbertdam.nl/share/2.png
J'ai créé un Style pour un ScrollViewer
qui affiche la barre de défilement sur le dessus de la ListBox
de l'élément de contenu. Dans le ListBox
de l'élément de datatemplate j'ai réservé un peu d'espace pour la barre de défilement apparaît.
Grâce,
Robbert Barrage
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, je pense que vous avez besoin d'élaborer sur ce que vos limites sont et de ce que vous essayez d'atteindre. Sans cela, je ne peux expliquer pourquoi ce que vous faites ne fonctionne pas. Quelqu'un peut même avoir une meilleure idée sur la façon d'obtenir les résultats que vous êtes après.
Si vous mettez
ListBox
à l'intérieur d'unScrollViewer
, puis le modèle de contrôle pourListBox
a toujours ses propresScrollViewer
à l'intérieur. Lorsque le curseur de la souris est sur leListBox
et vous faites défiler la molette de la souris, que l'événement bulles jusqu'à ce qu'il atteigne laScrollViewer
qui fait partie deListBox
. Qu'on le manipule par le défilement et les marques de l'événement comme traité, alors laScrollViewer
vous mettez leListBox
à l'intérieur de ignore l'événement.Si vous faites le
ListBox
plus haut et plus étroit que l'extérieurScrollViewer
, et de lui donner suffisamment d'éléments pour que leListBox
lui-même peut faire défiler les éléments, vous verrez 2 vertical des barres de défilement: 1 dans leListBox
, et 1 à l'extérieur de laListBox
pour votre extérieurScrollViewer
. Lorsque le curseur de la souris est à l'intérieur de laListBox
, leListBox
défiler les éléments avec son intérieurScrollViewer
, et sonBorder
va rester en place. Lorsque le curseur de la souris est en dehors de laListBox
et à l'intérieur de l'extérieurScrollViewer
, queScrollViewer
fera défiler son contenu -- leListBox
-- ce que vous pouvez vérifier en constatant que l'ListBox
'sBorder
change de position.Si vous voulez un extérieur
ScrollViewer
pour faire défiler l'ensemble deListBox
de contrôle (y compris laBorder
et pas seulement les éléments), vous aurez besoin de re-style de laListBox
afin de ne pas avoir à l'intérieur unScrollViewer
, mais vous aurez aussi besoin pour s'assurer qu'il obtient automatiquement plus grand en fonction de ses éléments.Je ne recommande pas cette approche pour un couple de raisons. Il pourrait avoir un sens si il y a d'autres contrôles à l'intérieur de la
ScrollViewer
avec leListBox
, mais votre exemple n'indique pas que. Aussi, si vous allez avoir beaucoup d'éléments dans leListBox
, vous allez créerListBoxItem
s pour chacun, l'élimination de tout avantage que le défaut, la non-re-styleListBox
vous donne en raison du défautVirtualizingStackPanel
.S'il vous plaît laissez-nous savoir ce que vos besoins réels sont.
Edit: Ok, j'ai maintenant un peu mieux l'idée, avec l'ajout de ces images. L'effet que vous obtenez est que quand il y a suffisamment d'éléments pour faire défiler et de la barre de défilement s'affiche, la surface disponible est de réduire un peu l'horizontale parce que le
ScrollViewer
's modèle utilise unGrid
. Ceux-ci semblent être vos options, dans l'ordre de la moins-de-mieux:ListBox
de ne pas avoir deScrollViewer
et l'utilisation de votre re de styleScrollViewer
à l'extérieur de laListBox
. Vous pouvez également forcer laListBox
aussi être assez haut pour afficher tous les éléments dans le mêmeStyle
, et maintenant vous avez perdu de l'INTERFACE utilisateur de la virtualisation. Si vous allez être en montrant des centaines d'éléments dans la liste, vous certainement ne veux pas le perdre.ListBox
et définir laControlTemplate
d'utiliser unScrollViewer
avec le style que vous avez déjà créé pour que met la barre de défilement sur le contenu plutôt que dans une colonne séparée. Celui-ok (ListBox
arrive à la limite de sa hauteur et de l'utilisation d'unVirtualizingStackPanel
, youpi), mais comme vous l'avez dit, elle nécessite une prise de conscience de ce que dans votreDataTemplate
.ScrollViewer
à laisser de l'espace pour la barre de défilement verticale, même quand il n'est pas visible. Voici ce que cette option ressemble:Par défaut,
ScrollViewer
utilise 2 colonnes dans unGrid
équivalent à ceci:De sorte que le
Width
de la barre de défilement de la colonne est 0 lorsque la barre de défilement n'est pas visible, car leWidth="Auto"
. Laisser de l'espace pour la barre de défilement, même lorsqu'il est masqué, nous lier leWidth
de cette colonne à laWidth
de la barre de défilement verticale:Alors maintenant, la
ControlTemplate
dans la coutumeStyle
pourScrollViewer
pourrait ressembler à ceci:Vous pourriez même faire le contenu de la colonne d'une taille fixe et de la barre de défilement de la colonne
Width="*"
, qui pourrait fonctionner mieux dans le long terme, si votre image n'est pas tendu. Maintenant, leDataTemplate
n'a pas à compenstate pour la largeur de la barre de défilement, qu'il obtient une cohérence à l'utiliser si la barre de défilement est visible ou non.Vous aurez probablement envie de vérifier le reste de la exemple
ControlTemplate
parScrollViewer
, mais ces exemples ne sont pas les styles par défaut. Noter que l'exemple met la barre de défilement verticale sur la gauche de la! Notez également le commentaire en bas surContentScrollPresenter
.J'étais traitant de la même question. J'ai mis le ListBox.ItemsPanel Propriété, sans aucune ScrollViewer:
Espère que cette aide.
voir ce lien pour une autre réponse:Faites défiler jusqu'à ScrollViewer lorsque la souris sur ListBox
Bonjour, je pense que vous pouvez gérer l'ensemble de la zone de liste de PreviewMouseWheel événement. Cela affectera également les éléments individuels, tant que vous n'avez pas à traiter chaque élément