Comment puis-je avoir une ListBox défilement automatique lorsqu'un nouvel élément est ajouté?
J'ai un WPF zone de liste qui est mis à faire défiler horizontalement. Le ItemsSource est lié à une ObservableCollection dans ma classe ViewModel. Chaque fois qu'un nouvel élément est ajouté, je veux la liste pour faire défiler vers la droite de sorte que le nouvel élément est visible.
La zone de liste est définie dans un DataTemplate, donc je suis incapable d'accéder à la zone de liste par nom dans mon fichier code-behind.
Comment puis-je obtenir un contrôle ListBox à toujours faites défiler jusqu'à afficher un dernier élément ajouté?
Je voudrais un moyen de savoir si la zone de liste a un nouvel élément, ajouté à cela, mais je ne vois pas un événement qui ne de cette.
InformationsquelleAutor Rob Buhler | 2010-01-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez étendre le comportement de la zone de liste en utilisant les propriétés attachées. Dans votre cas, je voudrais définir une propriété attachée appelé
ScrollOnNewItem
que lorsque la valeurtrue
crochets dans leINotifyCollectionChanged
événements de la liste des éléments de la zone de source et lors de la détection d'un nouvel élément, fait défiler la liste à cocher pour elle.Exemple:
Utilisation:
Mise à JOUR Comme par Andrej la suggestion dans les commentaires ci-dessous, j'ai ajouté des crochets pour détecter un changement dans la
ItemsSource
de laListBox
.Behavior(Of T)
classe du tout! Regarde plus courtes et lisibles.BringIntoView()
ne semble pas fonctionner. En debug, je peux voir le code en cours d'exécution, mais leListBox
n'a pas de défilement. J'ai vu quelqu'un d'autre ayant un problème similaire: stackoverflow.com/questions/12430923/...J'ai trouvé un vraiment nappe façon pour ce faire, il suffit de mettre à jour la zone de liste scrollViewer et définir la position vers le bas. Appelez cette fonction dans un de la liste des Événements comme SelectionChanged par exemple.
ListBox.ScrollIntoView
ne fonctionne pasJ'utilise cette solution: http://michlg.wordpress.com/2010/01/16/listbox-automatically-scroll-currentitem-into-view/.
Il fonctionne même si vous liez listbox est ItemsSource à une ObservableCollection qui est manipulé dans un non-thread d'INTERFACE utilisateur.
solution pour Datagrid (le même que pour la zone de liste, uniquement de substitution DataGrid avec classe ListBox)
MVVM-style de Comportement Attaché à
Ce Comportement Attaché défile automatiquement la zone de liste vers le bas lorsqu'un nouvel élément est ajouté.
Dans votre
ViewModel
, vous pouvez lier à booléenneIfFollowTail { get; set; }
pour contrôler si le défilement automatique est active ou non.Le Comportement de toutes les bonnes choses:
IfFollowTail=false
est situé dans le ViewModel, la zone de liste n'est plus défile vers le bas sur un nouveau point.IfFollowTail=true
est situé dans le ViewModel, la zone de liste instantanément défile vers le bas, et continue de le faire.Comportement De Code C#
Pont d'événements à Réactif avec les Extensions
Enfin, ajoutez cette méthode d'extension de sorte que nous pouvons utiliser toutes les RX bonté:
Ajouter Réactif Extensions
Vous aurez besoin d'ajouter
Reactive Extensions
à votre projet. Je recommandeNuGet
.La plus straight-forward moyen que j'ai trouvé pour ce faire, en particulier pour la zone de liste (ou liste) qui est lié à une source de données est de le brancher avec la collection de modifier l'événement.
Vous pouvez le faire très facilement à DataContextChanged cas de la zone de liste:
Ce n'est en fait qu'une combinaison de toutes les autres réponses que j'ai trouvé.
J'ai l'impression que c'est un trivial caractéristique que nous ne devrions pas avoir besoin de passer autant de temps (et de lignes de code) en train de faire.
Si seulement il y avait une Autoscroll = true à la propriété. Soupir.
J'ai trouvé un moyen beaucoup plus simple qui m'a aidé avec un problème similaire, juste un couple de lignes de code derrière, pas besoin de créer des Comportements. De vérifier ma réponse à cette question (et à suivre le lien à l'intérieur):
wpf C#) DataGrid ScrollIntoView - comment faites défiler jusqu'à la première ligne qui n'est pas démontré?
Il travaille pour ListBox, ListView et DataGrid.
Je n'étais pas heureux avec des propositions de solutions.
Voici ce que j'ai. Peut-être qu'il va sauver quelqu'un certain temps.
Donc ce que j'ai lu dans ce topcs est un peu complexe pour une simple action.
J'ai donc souscrit à scrollchanged événement, puis j'ai utilisé ce code:
Bonus:
Après j'ai fait une case où je pourrais le mettre quand je veux utiliser la fonction de défilement automatique, et je relaized j'ai oublié quelques fois décochez la zone de liste si j'ai vu quelques informations intéressantes pour moi. J'ai donc décidé que je voudrais créer un intelligent autoscrolled listbox ce qui réagissent à mon action de la souris.
Quand je scolled de botton la case cochée vrai et le séjour de mon point de vue sur le fond si je scroulled avec la molette de la souris checkox sera désactivée et vous pouvez explorer vous listbox.
C'est la solution que j'ai utiliser qui fonctionne, qui pourrait aider quelqu'un d'autre;