c# - 如何以编程方式滚动 WPF ListView ?

标签 c# .net wpf listview

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

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

最佳答案

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

这里有一个小 helper ,可以获取 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 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 公开的逻辑滚动仍然按项目滚动,如果你想按设定数量滚动,你应该使用我上面使用的 ScrollToHorizo​​ntal/VerticalOffset。如果您还想要一些更复杂的滚动,请查看我在此 other question 中提供的答案。 .

关于c# - 如何以编程方式滚动 WPF ListView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1009036/

相关文章:

c# - 为什么泛型方法不能推断参数类型?

c# - 如何在 C# 中模拟多重继承?

c# - 将 Active Directory 与用于 SPA 的 Web API 结合使用

c# - 在属性中指定 T

c# - WPF 中的 OpenGL 控件 - 如何?

c# - WPF/C# : How does one reference TabItems inside a TabControl?

c# - 将 C# 类转换为 SQL 表

c# - C#中有 "Records"吗?

.net - 事件无法设置在其范围内定义的变量?

wpf 滚动查看器 scrolltoverticaloffset