How can I get the VerticalOffset of a LongListSelector in WP8

♀尐吖头ヾ 提交于 2019-12-18 11:43:13

问题


In WP7, the LongListSelector had a underlying ScrollViewer, from which I could recover the vertical offset of the list. But in Windows Phone 8, there's no underlying ScrollViewer nor any similar class that provides me with that VerticalOffset property.

I've been searching and didn't find anything. I could settle with a function that gives the first visible element in the list, but I haven't found anything either. The ItemRealized event is not useful for that, as it doesn't give the exact item that is being shown on top of the viewport.


回答1:


This will give you the first visible item in the 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;
}


来源:https://stackoverflow.com/questions/15121139/how-can-i-get-the-verticaloffset-of-a-longlistselector-in-wp8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!