2013-02-27 11 views
6

In WP7 hatte der LongListSelector einen darunter liegenden ScrollViewer, von dem ich den vertikalen Offset der Liste wiederherstellen konnte. Aber in Windows Phone 8 gibt es keinen zugrunde liegenden ScrollViewer oder eine ähnliche Klasse, die mir diese VerticalOffset-Eigenschaft zur Verfügung stellt.Wie bekomme ich den VerticalOffset eines LongListSelectors in WP8?

Ich habe gesucht und habe nichts gefunden. Ich könnte mit einer Funktion abrechnen, die das erste sichtbare Element in der Liste gibt, aber ich habe auch nichts gefunden. Das ItemRealized-Ereignis ist dafür nicht geeignet, da es nicht das genaue Element angibt, das über dem Ansichtsfenster angezeigt wird.

+0

Schuss im Dunkeln - aber ich fragte eine ähnliche Frage gestern. Überprüfen Sie die Antwort. Vielleicht könntest du 'ScrollViewer' durch' LongListSelector' ersetzen? Sie müssten nicht 'ScrollToVerticalOffset()' aufrufen, aber Sie könnten etwas ähnliches tun, um den Offset zu bekommen. Nur ein Gedanke! http://stackoverflow.com/questions/15114991/how-to-use-scrollviewer-scrollttoverticaloffset – lhan

+0

Das Problem ist, dass ich die LLS nicht mit einem ScrollViewer ersetzen kann, brauche ich die ItemsSource-Bindung und tun es von mir selbst ist kein gute Wahl. Danke trotzdem. – gjulianm

Antwort

18

Dies wird Ihnen das erste sichtbare Element in der LLS geben.

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; 
} 
+0

Scheint vernünftig. Ich werde es heute später versuchen, danke! – gjulianm

+1

Beachten Sie, dass 'GetTemplateChild (" ViewPortControl "). Viewport.Top;' Ihnen den VerticalOffset gibt, aber Sie können nicht zurück blättern, so dass Sie die Elemente verfolgen müssen. – pantaloons

+0

Funktioniert perfekt und keine merklichen Leistungseinbußen. Vielen Dank! – gjulianm