一直在网上搜索答案,但我没有找到任何可以做到这一点:
我想以编程方式更改WPF列表中的确切位置。一些说法
ListView.Scrollposition.Y = some value;
我唯一能找到的是将值更改为Listview中的对象,而不是特定的坐标。 如果有人在这个主题上有一些好的文章或帖子,我将非常感激!
感谢。
答案 0 :(得分:6)
使用ListView
元素无法做到这一点。相反,您需要访问其ScrollViewer
,然后您可以使用ScrollViewer.ScrollToVerticalOffset
Method设置ScrollViewer
的垂直位置。您还需要使用ScrollViewer.VerticalOffset
,ScrollViewer.VerticalOffset
,ScrollViewer.ViewportHeight
和ScrollViewer.ExtentHeight
属性来衡量您在ScrollViewer
中的位置。
来自MSDN上的ScrollViewer
Class页:
包含ScrollViewer所有内容的区域是范围。内容的可见区域是视口。
最后,您如何从ScrollViewer
获得ListView
?我不能保证这会在ListView
上有效,但在ListBox
上有效。您可以使用VisualTreeHelper.GetChild
Method深入研究ListView
的可视树,它应该包含Border
,然后是ScrollViewer
,因此您应该能够做这样的事情:
Border border = (Border)VisualTreeHelper.GetChild(YourListView, 0);
ScrollViewer scrollViewer = VisualTreeHelper.GetChild(border, 0) as ScrollViewer;
if (scrollViewer != null)
{
scrollViewer.ScrollToVerticalOffset(60.0);
}
如果做因GetChild
方法返回的内容出错,则可以通过调试来轻松调整。只需在那里放一个断点,看看每个子类型是什么,并添加另一行与其中一个元素......最终,它应该找到ScrollViewer
。但是,我认为该代码应该没问题。
答案 1 :(得分:5)
如果是ListView
,那么首先您需要找到ScrollViewer
:
private ScrollViewer FindScrollViewer(DependencyObject d)
{
if (d is ScrollViewer)
return d as ScrollViewer;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(d); i++)
{
var sw = FindScrollViewer(VisualTreeHelper.GetChild(d, i));
if (sw != null) return sw;
}
return null;
}
当你找到它时,你可以ScrollToVerticalOffset
var sw = FindScrollViewer(listView);
if (sw != null) sw.ScrollToVerticalOffset(x);