C# Windows 10 SCROLINTOWVIEW()不滚动到ListVIEW中间的项
我有一个包含20个项目的列表视图。我想以编程方式滚动ListviewC# 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]) 应该滚动到列表的第
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。看看你是个天才。我爱你@非常感谢。在你的帮助下,我成功地创建了