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.
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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With