6

WP7では、LongListSelectorには基礎となるScrollViewerがあり、そこからリストの垂直オフセットを復元できました。しかし、Windows Phone 8には、基盤となるScrollViewerも、そのVerticalOffsetプロパティを提供する同様のクラスもありません。

検索してみましたが、何も見つかりませんでした。リストの最初に表示される要素を与える関数で解決できましたが、何も見つかりませんでした。ItemRealizedイベントは、ビューポートの上に表示されている正確なアイテムを提供しないため、そのためには役立ちません。

4

1 に答える 1

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;
}
于 2013-02-28T08:40:53.900 に答える