如何以编程方式滚动WPF列表视图?

Joa*_*nge 17 .net c# wpf listview

是否可以以编程方式滚动WPF列表视图?我知道winforms不会这样做,对吧?

我说的是向上或向下滚动50个单位等.不要一次滚动整个项目高度.

rmo*_*ore 30

是的,您必须从ListView中获取ScrollViwer,或者只要您有权访问它,就可以使用它公开的方法或覆盖滚动.您还可以通过获取主要内容区域并使用它的IScrollInfo接口实现来滚动.

这里有一个小帮手可以获得类似ListBox,ListView等的ScrollViwer组件.

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;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用.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>
Run Code Online (Sandbox Code Playgroud)

LineUp和LineDown公开的逻辑滚动仍然按项目滚动,如果你想按设定的数量滚动,你应该使用我上面使用过的ScrollToHorizo​​ntal/VerticalOffset.如果你想要一些更复杂的滚动,那么看看我在另一个问题中提供的答案.

  • 对于垂直向下滚动和向上滚动,您将向"VerticalOffset"添加3.这是对的吗?对于up,我们需要减去3而不是add. (2认同)

Ecl*_*pse 5

您是否尝试过ScrollIntoView?另外,如果不是您要查看的特定项目,而是与当前位置的偏移量,则可以使用BringIntoView