6

से GetItemsInView() को हटाया गया है, विंडोज फोन टूलकिट के नवीनतम अपडेट के साथ उन्होंने आम रिलीज के लिए LongListSelector के आंतरिक को ओवरहाल किया है। परिवर्तनों में से एक GetItemsInView() फ़ंक्शन के लिए समर्थन हटा रहा था (अब यह एक खाली सूची देता है)। इस फ़ंक्शन ने पहले उन आइटम्स की एक सूची लौटा दी जो स्क्रीन पर वर्तमान में दिखाई दे रहे थे। जब मैं किसी पृष्ठ से दूर नेविगेट करते समय शीर्षतम दृश्यमान आइटम का संदर्भ प्राप्त करने के लिए इसका उपयोग कर रहा था ताकि मैं ScrollTo(object item) का उपयोग कर टॉम्बस्टोन के बाद पुनर्प्राप्ति का समर्थन कर सकूं।WP7 टूलकिट अपडेट LongListSelector

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

+0

मुझे लगता है कि आप एक चयनित आइटम सूचकांक का उपयोग नहीं कर सकते हैं? – jv42

+0

मैंने इसके बारे में सोचा, लेकिन चयन के बिना उपयोगकर्ता को स्थिति में स्क्रॉल करना संभव है। – CactusPCJack

+0

टूलकिट के स्रोत कोड को आपके लिए एक विकल्प संशोधित कर रहा है? मुझे पता है कि मुझे इसे एक परियोजना के लिए करना था, वहां एक बड़ी स्क्रॉलिंग बग थी। – jv42

उत्तर

4

मैं नए बिट्स से क्या कह सकता हूं, आपको एलएलएस के Link और Unlink ईवेंट की सदस्यता लेनी होगी। Link एक तर्क में गुज़र जाएगा जिसमें एलएलएस के दृश्य भाग में जोड़ा गया आइटम शामिल है। Unlink एलएलएस से हटाई गई वस्तुओं के लिए वही करता है।

List<string> trackedItems = new List<string>(); 

private void myListOfStrings_Link(object sender, LinkUnlinkEventArgs e) 
{ 
    var x = e.ContentPresenter; 
    if (x == null || x.Content == null) 
     return; 
    trackedItems.Add(x.Content.ToString()); 
} 

private void myListOfString_Unlink(object sender, LinkUnlinkEventArgs e) 
{ 
    var x = e.ContentPresenter; 
    if (x == null || x.Content == null) 
     return; 
    trackedItems.Remove(x.Content.ToString()); 
} 

ध्यान दें कि Link और Unlink अंतर्निहित सूची में हर गाया आइटम के लिए सक्रिय कर देगा, इसलिए यदि आप LLS का समूहीकरण सुविधाओं का उपयोग कर रहे हैं, तो आप होगा: तो आप कुछ इस तरह करते हैं चाहते हैं वास्तव में वापस आने वाले किस प्रकार के आधार पर आइटम को ट्रैक करना है या नहीं, इस पर अपना परीक्षण बढ़ाने के लिए। तो अगर आप जिसके लिए आप underrlying वस्तुओं को ट्रैक करना चाहते समूह वस्तु किसी प्रकार का है, तो आप कुछ इस तरह कर सकते हैं:

private void myGroupedListOfObjects_Link(object sender, LinkUnlinkEventArgs e) 
{ 
    var x = e.ContentPresenter; 
    if (x == null || x.Content == null) 
     return; 
    var myObject = x.Content as MyObject; 
    if (myObject != null) 
    { 
     foreach (var item in myObject.Items) 
     { 
      trackedItems.Add(item); 
     } 
    } 
} 

मुझे आशा है कि इस मदद करता है! अगर यह काम करता है तो हमें बताएं।

+0

बहुत अच्छा। मैं इस समय आम आरसी स्थापित कर रहा हूं या मैं आपके विचारों के साथ खेलना चाहता हूं। बहिष्करण चेतावनियों के आधार पर यह वह उत्तर है जिसका मैं उम्मीद कर रहा था। मेरा एकमात्र अनुवर्ती प्रश्न यह है कि आप कैसे निर्धारित कर सकते हैं (लिंक और अनलिंक के साथ) कौन सा आइटम सबसे ऊपर है? ऐसा लगता है कि आपको यह जानना होगा कि वे किस दिशा में स्क्रॉल कर रहे थे। – CactusPCJack

+0

आह - अच्छा पकड़ो। मैंने उस हिस्से के बारे में सोचा नहीं था। मुझे इसके बारे में सोचने दो और बाद में मेरी कुछ मीटिंग्स को रास्ते से बाहर करने के बाद समाधान पोस्ट करने का प्रयास करें ... –

+0

ठीक है - केवल एक चीज जिसे मैं सोच सकता हूं ट्रैक ऑटैम सूची को ऑब्जेक्ट की स्थिति रिकॉर्ड करने के लिए बदलना है myListOfStrings संग्रह में और वहां न्यूनतम मान प्राप्त करें। बहुत गुस्सा, लेकिन काम करना चाहिए। –

3

LongListSelector आंतरिक रूप से ScrollViewer (स्पष्ट रूप से अगस्त 2011 रिलीज के बाद) का उपयोग कर रहा है। इस तथ्य का उपयोग पिवट नियंत्रक के लिए http://damianblog.com/2011/01/21/wp7-scroll-pivot/ पर दिए गए उदाहरण का पालन करके टॉम्बस्टनिंग के बाद सूची की स्थिति को पुनर्स्थापित करने के लिए किया जा सकता है।

OnNavigatedFrom() में याद स्क्रॉल ऑफसेट:

private bool _newPageInstance = true; 
    private double _scollOffset = double.NaN; 

    protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) 
    { 
     base.OnNavigatedFrom(e); 

     var scrollViewer = FindScrollViewer(LongList); 
     State["scrollViewer.VerticalOffset"] = scrollViewer.VerticalOffset; 
     State["PreservingPageState"] = true; 
     _newPageInstance = false; 
    } 

    private static ScrollViewer FindScrollViewer(DependencyObject parent) 
    { 
     var childCount = VisualTreeHelper.GetChildrenCount(parent); 
     for (var i = 0; i < childCount; i++) 
     { 
      var elt = VisualTreeHelper.GetChild(parent, i); 
      if (elt is ScrollViewer) return (ScrollViewer)elt; 
      var result = FindScrollViewer(elt); 
      if (result != null) return result; 
     } 
     return null; 
    } 

और OnNavigatedTo() में बहाल करता है, तो अनुप्रयोग tombstoned किया गया है:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 

     if (!_newPageInstance || !State.ContainsKey("PreservingPageState")) 
     { 
      return; 
     } 

     _scollOffset = (double)State["scrollViewer.VerticalOffset"]; 
    } 

    private void LongList_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (double.IsNaN(_scollOffset)) return; 

     var longListSelector = (LongListSelector)sender; 
     var scrollViewer = FindScrollViewer(longListSelector); 
     scrollViewer.ScrollToVerticalOffset(_scollOffset); 
     _scollOffset = double.NaN; 
    } 
+0

यह काम कर रहा है, धन्यवाद – Tim

2

लिंक/अनलिंक दृष्टिकोण बहाल करने के लिए बिल्कुल भी काम नहीं करता है स्क्रॉल स्थिति। यहां तक ​​कि यदि आप संग्रह सेट अप करते हैं, तो आप नहीं जानते कि आप ऊपर या नीचे स्क्रॉल कर रहे हैं, और संग्रह का आकार LongListSelector की संपत्ति के आधार पर अलग-अलग होगा।

Kvakulo के उत्तर में FindScrollViewer समाधान, हालांकि, काम करता है।

कोई इस कोड के VB.Net संस्करण की जरूरत है:

Friend Function FindScrollViewer(parent As DependencyObject) As ScrollViewer 

    Dim childCount = VisualTreeHelper.GetChildrenCount(parent) 

    For i As Int32 = 0 To childCount - 1 

     Dim elt = VisualTreeHelper.GetChild(parent, i) 

     If elt.GetType Is GetType(ScrollViewer) Then Return CType(elt, ScrollViewer) 

     Dim result = FindScrollViewer(elt) 
     If result IsNot Nothing Then Return result 

    Next 

    Return Nothing 

End Function