如何在WP8中获取LongListSelector的VerticalOffset

时间:2013-02-27 19:55:08

标签: windows-phone-7 windows-phone-8 longlistselector

在WP7中,LongListSelector有一个底层的ScrollViewer,我可以从中恢复列表的垂直偏移量。但是在Windows Phone 8中,没有底层的ScrollViewer,也没有任何类似的类为我提供了VerticalOffset属性。

我一直在搜索,但没有找到任何东西。我可以使用一个函数来解决列表中的第一个可见元素,但我也没有找到任何东西。 ItemRealized事件对此没有用,因为它没有给出在视口顶部显示的确切项目。

1 个答案:

答案 0 :(得分:18)

这将为您提供LLS中的第一个可见项目。

private Dictionary<object, ContentPresenter> items;

private object GetFirstVisibleItem(LongListSelector lls)
{
    var offset = FindViewport(lls).Viewport.Top;
    return items.Where(x => Canvas.GetTop(x.Value) + x.Value.ActualHeight > offset)
        .OrderBy(x => Canvas.GetTop(x.Value)).First().Key;
}

private void LLS_ItemRealized(object sender, ItemRealizationEventArgs e)
{
    if (e.ItemKind == LongListSelectorItemKind.Item)
    {
        object o = e.Container.DataContext;
        items[o] = e.Container;
    }
}

private void LLS_ItemUnrealized(object sender, ItemRealizationEventArgs e)
{
    if (e.ItemKind == LongListSelectorItemKind.Item)
    {
        object o = e.Container.DataContext;
        items.Remove(o);
    }
}

private static ViewportControl FindViewport(DependencyObject parent)
{
    var childCount = VisualTreeHelper.GetChildrenCount(parent);
    for (var i = 0; i < childCount; i++)
    {
        var elt = VisualTreeHelper.GetChild(parent, i);
        if (elt is ViewportControl) return (ViewportControl)elt;
        var result = FindViewport(elt);
        if (result != null) return result;
    }
    return null;
}
相关问题