Comment puis-je faire défiler par programme une listview WPF?

Est-il possible de faire défiler par programme une listview WPF? Je sais que Winforms ne le fait pas, non?

Je parle de faire défiler 50 unités vers le haut ou le bas, etc. Ne pas faire défiler la hauteur d’un élément en une fois.

Oui, vous devrez récupérer ScrollViwer à partir de ListView, mais une fois que vous avez access à cela, vous pouvez utiliser les méthodes exposées par celui-ci ou remplacer le défilement. Vous pouvez également faire défiler en récupérant la zone de contenu principale et en utilisant sa mise en œuvre de l’interface IScrollInfo .

Voici un petit assistant pour obtenir le composant ScrollViwer de quelque chose comme un ListBox, ListView, etc.

public static DependencyObject GetScrollViewer(DependencyObject o) { // Return the DependencyObject if it is a ScrollViewer if (o is ScrollViewer) { return o; } for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++) { var child = VisualTreeHelper.GetChild(o, i); var result = GetScrollViewer(child); if (result == null) { continue; } else { return result; } } return null; } 

Et puis vous pouvez simplement utiliser .LineUp () et .LineDown () comme ceci:

 private void OnScrollUp(object sender, RoutedEventArgs e) { var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer; if (scrollViwer != null) { // Logical Scrolling by Item // scrollViwer.LineUp(); // Physical Scrolling by Offset scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3); } } private void OnScrollDown(object sender, RoutedEventArgs e) { var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer; if (scrollViwer != null) { // Logical Scrolling by Item // scrollViwer.LineDown(); // Physical Scrolling by Offset scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3); } }        

Le défilement logique exposé par LineUp et LineDown défile toujours par élément. Si vous souhaitez faire défiler d’un montant défini, vous devez utiliser le paramètre ScrollToHorizontal / VerticalOffset que j’ai utilisé ci-dessus. Si vous souhaitez également un défilement plus complexe, jetez un coup d’œil à la réponse que j’ai fournie dans cette autre question .

Avez-vous essayé ScrollIntoView ? Vous pouvez également utiliser BringIntoView s’il ne s’agit pas d’un élément spécifique que vous avez mis en évidence, mais d’un décalage par rapport à la position actuelle.