如何在 ScrollViewer (ListView) 中查找项目的位置?

Posted

技术标签:

【中文标题】如何在 ScrollViewer (ListView) 中查找项目的位置?【英文标题】:How to find the position of an item within a ScrollViewer (ListView)? 【发布时间】:2016-01-07 08:07:36 【问题描述】:

我有一个 ListView,我想找到一个特定项目的偏移量,以便以后可以将它居中在我的 listView 上,滚动到对应的垂直偏移量。

到目前为止,我找不到任何方法来检索 ScrollViewer 中项目的位置(偏移量)。

【问题讨论】:

【参考方案1】:

有一种方法可以在 ScrollViewer 中查找项目位置(偏移量)。

如果要在 ListView 中查找项目偏移量,则首先必须在 ListView 中获取 ScrollViewer:

ScrollViewer scrollViewer = GetScrollViewer(MyListView);

public static ScrollViewer GetScrollViewer(DependencyObject depObj)

    var obj = depObj as ScrollViewer;
    if (obj != null) return obj;

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

        var result = GetScrollViewer(child);
        if (result != null) return result;
    
    return null;

这样您就可以访问 ScrollViewer。如果您在 ListView 中有一组项目,您还必须获取有关该项目的容器 (FrameworkElement)。

var container = MyListView.ContainerFromItem(myItemInListView);

如果您已经拥有容器,则可以继续执行以下代码:

FrameworkElement element = container as FrameworkElement;
if (element != null)

    var transform = element.TransformToVisual(viewer);
    var positionInScrollViewer = transform.TransformPoint(new Point(0, 0));

positionInScrollViewer 对象将是一个点,因此,您可以通过访问 positionInScrollViewer.Y 获得verticalOffset,或者如果您正在处理水平ScrollViewer,您应该访问positionInScrollViewer.X,您将获得所需对象的偏移量/项目。

【讨论】:

以上是关于如何在 ScrollViewer (ListView) 中查找项目的位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在ListBox中禁用ScrollViewer?

如何让 ScrollViewer 在 StackPanel 中工作?

如何在 Blend 的设计时滚动 ScrollViewer

如何在 ScrollViewer (ListView) 中查找项目的位置?

如何在 ScrollViewer 中获得 Adorner 与其装饰元素的一对一匹配?

如何自动滚动 ScrollViewer - 仅当用户未更改滚动位置时