【问题标题】:How can I get the VerticalOffset of a LongListSelector in WP8如何在 WP8 中获取 LongListSelector 的 VerticalOffset
【发布时间】:2013-02-27 19:55:07
【问题描述】:

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

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

【问题讨论】:

  • 在黑暗中拍摄 - 但我昨天问了一个类似的问题。查看答案。也许您可以用您的LongListSelector 替换ScrollViewer?你不需要打电话给ScrollToVerticalOffset(),但你可以做一些类似的事情来获得偏移量?只是一个想法! stackoverflow.com/questions/15114991/…
  • 问题是我不能用 ScrollViewer 替换 LLS,我需要 ItemsSource 绑定,而自己做不是一个好的选择。不过还是谢谢。

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


【解决方案1】:

这将为您提供 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;
}

【讨论】:

  • 请注意,GetTemplateChild(“ViewPortControl”).Viewport.Top; 将为您提供 VerticalOffset,但您无法滚动回它,因此您需要跟踪项目。
  • 完美运行,没有明显的性能开销。谢谢!
  • 嗨 pantaloons,如果 LLS 到达列表末尾,我需要得到通知,我该怎么做?有什么线索吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
相关资源
最近更新 更多