WP8

2013-02-27 161 views
6

में एक LongListSelector के वर्टिकल ऑफसेट को मैं WP7 में कैसे प्राप्त कर सकता हूं, LongListSelector में अंतर्निहित स्क्रॉलव्यूयर था, जिससे मैं सूची के लंबवत ऑफसेट को पुनर्प्राप्त कर सकता था। लेकिन विंडोज फोन 8 में, कोई अंतर्निहित स्क्रॉलव्यूयर नहीं है और न ही कोई समान वर्ग है जो मुझे वर्टिकल ऑफसेट संपत्ति प्रदान करता है।WP8

मैं खोज रहा हूं और कुछ भी नहीं मिला। मैं एक ऐसे फ़ंक्शन से निपट सकता हूं जो सूची में पहला दृश्य तत्व देता है, लेकिन मुझे कुछ भी नहीं मिला है। ItemRealized ईवेंट उस के लिए उपयोगी नहीं है, क्योंकि यह व्यूपोर्ट के शीर्ष पर दिखाया जा रहा सटीक आइटम नहीं देता है।

+0

अंधेरे में गोली मार दी - लेकिन मैंने कल एक समान सवाल पूछा। जवाब देखें। हो सकता है कि आप अपने 'LongListSelector' के साथ' ScrollViewer' को प्रतिस्थापित कर सकें? आपको 'स्क्रॉलटॉवर्टिकल ऑफसेट()' पर कॉल करने की आवश्यकता नहीं होगी, लेकिन आप ऑफसेट प्राप्त करने के समान ही संभवतः कुछ ऐसा कर सकते हैं? सिर्फ एक विचार! http://stackoverflow.com/questions/15114991/how-to-use-scrollviewer-scrolltoverticaloffset – lhan

+0

समस्या यह है कि मैं एलएलएस को स्क्रॉलव्यूअर के साथ प्रतिस्थापित नहीं कर सकता, मुझे आइटम्ससोर्स बाध्यकारी की आवश्यकता है और इसे स्वयं कर रहा है अच्छा विकल्प लेकिन फिर भी धन्यवाद। – gjulianm

उत्तर

18

यह आपको एलएलएस में पहली बार दिखाई देगा।

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;' आपको वर्टिकल ऑफसेट देगा, लेकिन आप इसे वापस स्क्रॉल नहीं कर सकते हैं, इसलिए आपको आइटम ट्रैक करने की आवश्यकता होगी। – pantaloons

+0

सही काम करता है और कोई ध्यान देने योग्य प्रदर्शन ओवरहेड नहीं करता है। धन्यवाद! – gjulianm