2013-02-27 25 views
6

在WP7中,LongListSelector有一個基礎的ScrollViewer,我可以從中恢復列表的垂直偏移量。但在Windows Phone 8中,沒有底層的ScrollViewer,也沒有任何類似的類爲我提供VerticalOffset屬性。如何獲取WP8中的LongListSelector的VerticalOffset

我一直在搜索,沒有找到任何東西。我可以用一個給出列表中第一個可見元素的函數來解決,但我還沒有找到任何東西。 ItemRealized事件對此沒有用處,因爲它不會提供在視口頂部顯示的確切項目。

+0

在黑暗中拍攝 - 但我昨天也有類似的問題。看看答案。也許你可以用'LongListSelector'來代替ScrollViewer?你不需要調用'ScrollToVerticalOffset()',但你可能做一些類似的事情來獲得偏移量?只是一個想法! http://stackoverflow.com/questions/15114991/how-to-use-scrollviewer-scrolltoverticaloffset – lhan 2013-02-27 21:59:16

+0

問題是,我不能用ScrollViewer替換LLS,我需要ItemsSource綁定,並且自己做它不是不錯的選擇。不過謝謝。 – gjulianm 2013-02-28 10:26:08

回答

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

似乎合理。我今天晚些時候會嘗試,謝謝! – gjulianm 2013-02-28 10:29:59

+1

請注意'GetTemplateChild(「ViewPortControl」),Viewport.Top;'會給你VerticalOffset,但你不能回滾到它,所以你需要跟蹤項目。 – pantaloons 2013-02-28 20:04:37

+0

工作完美,沒有明顯的性能開銷。謝謝! – gjulianm 2013-02-28 22:13:40

相關問題