2013-02-27 8 views
6

In WP7, LongListSelector aveva un ScrollViewer sottostante, dal quale potevo recuperare l'offset verticale della lista. Ma in Windows Phone 8, non esiste ScrollViewer sottostante né alcuna classe simile che mi fornisca la proprietà VerticalOffset.Come posso ottenere VerticalOffset di LongListSelector in WP8

Ho cercato e non ho trovato nulla. Potrei accontentarti di una funzione che fornisce il primo elemento visibile nell'elenco, ma non ho trovato nulla neanche io. L'evento ItemRealized non è utile per questo, in quanto non fornisce l'elemento esatto che viene mostrato nella parte superiore della finestra.

+0

sparato nel buio - ma ho fatto una domanda simile ieri. Controlla la risposta. Forse potresti sostituire 'ScrollViewer' con il tuo' LongListSelector'? Non avresti bisogno di chiamare 'ScrollToVerticalOffset()' ma potresti forse fare qualcosa di simile per ottenere l'offset? Solo un pensiero! http://stackoverflow.com/questions/15114991/how-to-use-scrollviewer-scrolltoverticaloffset – lhan

+0

Il problema è che non riesco a sostituire il LLS con un ScrollViewer, ho bisogno del binding di ItemsSource e farlo da solo non è un buona opzione Ma grazie comunque. – gjulianm

risposta

18

Questo ti darà il primo elemento visibile nel 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; 
} 
+0

Sembra ragionevole. Ci proverò più tardi oggi, grazie! – gjulianm

+1

Si noti che 'GetTemplateChild (" ViewPortControl "). Viewport.Top;' fornirà VerticalOffset, ma non è possibile tornare ad esso in modo da tenere traccia degli elementi. – pantaloons

+0

Funziona perfettamente e senza costi aggiuntivi delle prestazioni. Grazie! – gjulianm