2013-02-27 6 views
6

WP7では、LongListSelectorには基になるScrollViewerがあり、そのリストから垂直オフセットを復元できます。しかし、Windows Phone 8には、基礎となるScrollViewerや、そのVerticalOffsetプロパティを提供する類似のクラスはありません。WP8でLongListSelectorのVerticalOffsetを取得するには

私は検索していて何も見つかりませんでした。リストの最初の可視要素を与える関数で解決できますが、何も見つけられませんでした。 ItemRealizedイベントはビューポートの上に表示されている正確なアイテムを提供しないため、このイベントは役に立ちません。

+0

暗闇の中で撮影されました - しかし、私は昨日同様の質問をしました。答えを確認してください。おそらく 'ScrollViewer'をあなたの' LongListSelector'で置き換えることができますか?あなたは 'ScrollToVerticalOffset()'を呼び出す必要はありませんが、オフセットを取得するために同様のsomethignを行う可能性がありますか?ちょっとした考え! http://stackoverflow.com/questions/15114991/how-to-use-scrollviewer-scrolltoverticaloffset – lhan

+0

問題は、LLSをScrollViewerで置き換えることができず、ItemsSourceバインディングが必要で、自分で行うことができないということです。良いオプション。とにかくありがとう。 – gjulianm

答えて

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

+1

'GetTemplateChild(" ViewPortControl ")。Viewport.Top;'はVerticalOffsetを与えますが、項目を追跡する必要があるので、それをスクロールバックすることはできません。 – pantaloons

+0

完全に動作し、パフォーマンス上のオーバーヘッドはほとんどありません。ありがとう! – gjulianm

関連する問題