How can I programmatically scroll a WPF listview?

前端 未结 2 638
挽巷
挽巷 2020-12-15 19:46

Is it possible to programmatically scroll a WPF listview? I know winforms doesn\'t do it, right?

I am talking about say scrolling 50 units up or down, etc. Not scrol

2条回答
  •  天命终不由人
    2020-12-15 20:11

    Yes, you'll have to grab the ScrollViwer from the ListView, or but once you have access to that, you can use the methods exposed by it or override the scrolling. You can also scroll by getting the main content area and using it's implementation of the IScrollInfo interface.

    Here's a little helper to get the ScrollViwer component of something like a 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;
    }
    

    And then you can just use .LineUp() and .LineDown() like this:

    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);
        }
    }
    
    
    
        

    The Logical scrolling exposed by LineUp and LineDown do still scroll by item, if you want to scroll by a set amount you should use the ScrollToHorizontal/VerticalOffset that I've used above. If you want some more complex scrolling too, then take a look at the answer I've provided in this other question.

提交回复
热议问题