Как я могу программно прокрутить список списков WPF?

Можно ли программно прокручивать список списков WPF? Я знаю, что winforms этого не делает, правильно?

Я говорю о прокрутке 50 единиц вверх или вниз и т.д. Не прокручивая сразу всю высоту элемента.

Ответ 1

Да, вам придется захватить ScrollViwer из ListView, или, как только у вас есть доступ к нему, вы можете использовать методы, открытые им или переопределить прокрутку. Вы также можете прокручивать, получив основную область содержимого и используя ее реализацию интерфейса IScrollInfo.

Здесь немного помощника, чтобы получить компонент ScrollViwer чего-то вроде ListBox, ListView и т.д.

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

И тогда вы можете просто использовать .LineUp() и .LineDown() следующим образом:

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


<DockPanel>
    <Button DockPanel.Dock="Top"
            Content="Scroll Up"
            Click="OnScrollUp" />
    <Button DockPanel.Dock="Bottom"
            Content="Scroll Down"
            Click="OnScrollDown" />
    <ListView x:Name="uiListView">
        <!-- Content -->
    </ListView>
</DockPanel>

Логическая прокрутка, открытая LineUp и LineDown, все еще прокручивается по элементу, если вы хотите прокручивать заданную величину, вы должны использовать ScrollToHorizontal/VerticalOffset, который я использовал выше. Если вам нужна еще более сложная прокрутка, взгляните на ответ, который я предоставил в этом другом вопросе.

Ответ 2

Вы пробовали ScrollIntoView? В качестве альтернативы, если это не определенный элемент, который вы указали, а смещение от текущей позиции, вы можете использовать BringIntoView.