Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式滚动WPF listview?_C#_.net_Wpf_Listview - Fatal编程技术网

C# 如何以编程方式滚动WPF listview?

C# 如何以编程方式滚动WPF listview?,c#,.net,wpf,listview,C#,.net,Wpf,Listview,是否可以通过编程方式滚动WPF listview?我知道winforms不会这么做,对吧 我说的是向上或向下滚动50个单位,等等。不要一次滚动整个项目的高度。你试过了吗? 或者,如果它不是您带入视图的特定项目,而是与当前位置的偏移量,您可以使用。是的,您必须从列表视图中获取ScrollViwer,或者,一旦您可以访问它,您可以使用它公开的方法或覆盖滚动。您还可以通过获取主内容区域并使用其界面实现来滚动 这里有一个小助手,可以获取ListBox、ListView等的ScrollViwer组件 pu

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

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

你试过了吗?
或者,如果它不是您带入视图的特定项目,而是与当前位置的偏移量,您可以使用。

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

这里有一个小助手,可以获取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;
}
公共静态DependencyObject GetScrollViewer(DependencyObject o)
{
//如果是ScrollViewer,则返回DependencyObject
如果(o是ScrollViewer)
{返回o;}
for(int i=0;i
然后您可以像这样使用.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>
private void OnScrollUp(对象发送方,路由目标)
{
var scrollViwer=GetScrollViewer(uiListView)作为ScrollViewer;
如果(scrollViwer!=null)
{
//按项逻辑滚动
//scrollViwer.LineUp();
//按偏移量进行物理滚动
scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset+3);
}
}
private void OnScrollDown(对象发送器、路由目标)
{
var scrollViwer=GetScrollViewer(uiListView)作为ScrollViewer;
如果(scrollViwer!=null)
{
//按项逻辑滚动
//scrollViwer.LineDown();
//按偏移量进行物理滚动
scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset+3);
}
}

LineUp和LineDown显示的逻辑滚动仍然是按项滚动的,如果要按设定的数量滚动,应该使用我上面使用的ScrollToHorizontal/VerticalOffset。如果您还需要一些更复杂的滚动,请查看我在本文中提供的答案。

对于垂直向下和向上滚动,您将在“垂直偏移”中添加3。对吗?对于up,我们需要减3,而不是加。