C# Windows 10 SCROLINTOWVIEW()不滚动到ListVIEW中间的项

C# Windows 10 SCROLINTOWVIEW()不滚动到ListVIEW中间的项,c#,visual-studio,xaml,windows-10,uwp,C#,Visual Studio,Xaml,Windows 10,Uwp,我有一个包含20个项目的列表视图。我想以编程方式滚动Listview ListView?.ScrollIntoView(ListView.Items[0]) 将列表视图滚动到第一项 ListView?.ScrollIntoView(ListView.Items.Count - 1) 将listview滚动到页面底部 但是,我无法使用相同的功能将listview滚动到中间的项目 Eg: ListView?.ScrollIntoView(ListView.Items[5]) 应该滚动到列表的第

我有一个包含20个项目的列表视图。我想以编程方式滚动Listview

ListView?.ScrollIntoView(ListView.Items[0])
将列表视图滚动到第一项

ListView?.ScrollIntoView(ListView.Items.Count - 1)
将listview滚动到页面底部

但是,我无法使用相同的功能将listview滚动到中间的项目

Eg: ListView?.ScrollIntoView(ListView.Items[5])
应该滚动到列表的第5项。但它却把我带到了清单的第一项


如果可以通过一些解决方法实现这种行为,那就太好了。

ScrollIntoView只是将项目带到视图中,句号,它不会滚动到一行

如果在成员上调用该项,并且该项位于可见列表底部下方,则该项将向下滚动,直到该项成为可见列表中的最后一个成员

如果您对某个成员调用该项,并且该项位于列表顶部上方,则该项将向上滚动,直到该项成为列表中的第一个成员


如果您在一个成员上调用它,并且它当前可见,那么它根本不会执行任何操作。

我认为您要寻找的是一种方法,可以将元素实际滚动到
列表视图的顶部

在中,我创建了一个扩展方法,可以滚动到
ScrollViewer
中的特定元素

public static ScrollViewer GetScrollViewer(this DependencyObject element)
{
    if (element is ScrollViewer)
    {
        return (ScrollViewer)element;
    }

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
    {
        var child = VisualTreeHelper.GetChild(element, i);

        var result = GetScrollViewer(child);
        if (result == null)
        {
            continue;
        }
        else
        {
            return result;
        }
    }

    return null;
}
你的想法是一样的

您需要首先在
列表视图
中找到
滚动查看器
实例,然后找到要滚动到的实际项目,即
列表视图项目

这里有一个扩展方法来获取
ScrollViewer

public static ScrollViewer GetScrollViewer(this DependencyObject element)
{
    if (element is ScrollViewer)
    {
        return (ScrollViewer)element;
    }

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
    {
        var child = VisualTreeHelper.GetChild(element, i);

        var result = GetScrollViewer(child);
        if (result == null)
        {
            continue;
        }
        else
        {
            return result;
        }
    }

    return null;
}

更简单的方法,但没有动画 您还可以通过指定第二个参数来使用新的重载
ScrollIntoView
,以确保项目在顶部边缘对齐;然而,在我以前的扩展方法中,这样做并没有平滑的滚动转换

MyListView?.ScrollIntoView(MyListView.Items[5], ScrollIntoViewAlignment.Leading);
我这样解决这个问题:

 var sv = new ScrollViewerHelper().GetScrollViewer(listView);
        sv.UpdateLayout();
        sv.ChangeView(0, sv.ExtentHeight, null);
以及GetScrollViewer方法:

public ScrollViewer GetScrollViewer(DependencyObject element)
    {
        if (element is ScrollViewer)
        {
            return (ScrollViewer)element;
        }

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
        {
            var child = VisualTreeHelper.GetChild(element, i);

            var result = GetScrollViewer(child);
            if (result == null)
            {
                continue;
            }
            else
            {
                return result;
            }
        }

        return null;
    }
公共ScrollViewer GetScrollViewer(DependencyObject元素) { if(元素为ScrollViewer) { 返回(ScrollViewer)元素; } for(int i=0;i

代码所有者的信用

即使我调用了位于可见列表底部的成员,该函数也不起作用。假设,我在可见列表视图中有3项。ScrollIntoView(abc.ItemsCollection[6].item)理想情况下应将第6项作为可见列表视图的最后一项。但在我的情况下什么都没有发生,我的工作很有魅力。谢谢贾斯汀:)嘿,贾斯汀!我想知道如何在MVVM方法中附加相同的逻辑。比如在转换器内部使用CuffEvIEW逻辑,并将其直接绑定到ListVIEW ScReValueXAML。看看你是个天才。我爱你@非常感谢。在你的帮助下,我成功地创建了