Bonjour,
Ce matin j'ai eue envie d'apporté un peu de ma contribution.
Je développe actuellement un logiciel de gestion d'une supervision (un automate), il communique en port COM, et j'avais besoin de capturer les échanges sur ce port COM pour le débogage.
J'essaie de respecter le MVVM, et c'est mon 1er projet, WPF donc merci d'être indulgent, mais si vous voyer à améliorer le code n’hésiter pas.
Le principe de fonctionnement de l'autoscroll ne viens pas de moi, mais d'un certain shawnpfiore, il était toutefois en C# et la personne indiquait d'utiliser SelectionChanged, ce qui ne marchait pas chez moi. J'ai essayé plusieurs événements de la listbox sans résultat, j'ai donc décidé d'utiliser mon propre événement.
La vue instancie le vuemodele en lui passant son propre nom afin que le vuemodele puisse fermer facilement la vue, j'ai trouvé ce moyen simple de fermer les vues par le code.
Ensuite je déclare l'événement qui lancera le process d'autoscroll ou pas. je dit "ou pas", car j'ai la possibilité de le bloquer. Je rappel que le but est de visualiser la communication sur le port COM et cela peut aller très vite. De plus notre protocole de communication intègre des balises, CR, LF CRLF, SYNC etc.. le but étant la encore de les visualiser ou pas pour débogage.
Lorsque la vuemodele ajoute du texte elle déclenche aussi l'événement pour l'autoscroll.
J'avais trouvé aussi une méthode utilisant une classe ListBoxBehavior, mais cela fonctionnait de façon bizarre, j'avais parfois des sauts haut - bas qui ne permettaient pas de visualiser sereinement les lignes, de plus je ne pouvais pas arrêter l'autoscroll malgré le paramètre présent.
Voici le petit bout de code qui permet de faire l'autoscroll simplement:
Voici le projet démo simulation: (Petite erreur, je l'ai appelé listview, mais c'est bien une listbox)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Private Sub UpdateScrollBar(ByVal listBox As ListBox) If listBox IsNot Nothing Then Dim border = CType(VisualTreeHelper.GetChild(listBox, 0), Border) Dim scrollViewer = CType(VisualTreeHelper.GetChild(border, 0), ScrollViewer) scrollViewer.ScrollToBottom() End If End Sub
ProjetDemoListViewScrollAutoSimple.zip
Partager