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

问题描述 投票:0回答:2

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

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

c# .net wpf listview
2个回答
32
投票

您必须从 ListView 中获取 ScrollViewer 并使用它公开的方法来覆盖滚动。您还可以通过获取主要内容区域并使用它的 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;
}

然后你可以像这样使用 .LineUp() 和 .LineDown() :

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

private void OnScrollDown(object sender, RoutedEventArgs e)
{
    var scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;
    if (scrollViewer != null)
    {
        // Logical Scrolling by Item
        // scrollViewer.LineDown();
        // Physical Scrolling by Offset
        scrollViewer.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。如果您想要更复杂的滚动,请查看我在这个其他问题中提供的答案。


5
投票

您尝试过ScrollIntoView吗? 或者,如果它不是您带入视图的特定项目,而是相对于当前位置的偏移,您可以使用 BringIntoView

© www.soinside.com 2019 - 2024. All rights reserved.