Как программно прокрутить просмотр списка WPF? - PullRequest
17 голосов
/ 17 июня 2009

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

Я имею в виду, скажем, прокрутку на 50 единиц вверх или вниз и т. Д. Не прокручивать сразу всю высоту предмета.

Ответы [ 2 ]

30 голосов
/ 18 июня 2009

Да, вам нужно будет извлечь 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, по-прежнему прокручивается по элементу, если вы хотите прокрутить на заданную сумму, вы должны использовать ScrollToHor Horizontal / VerticalOffset, который я использовал выше. Если вам нужна более сложная прокрутка, посмотрите на ответ, который я дал в этом другом вопросе .

4 голосов
/ 17 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...