2011-05-09 21 views
6

मेरे पास संपत्ति वर्चुअलाइजिंगस्टैकपैनेल के साथ एक सूची बॉक्स है। वर्चुअलाइजेशन मोड "रीसाइक्लिंग" पर सेट है। मैं एक कस्टम संग्रह बाध्यकारी हूं (IList और IList<T> लागू करता है)।एक सूची बॉक्स में देखें आइटम

अब, यदि मैं सही समझता हूं, जब डेटा बाध्य होता है, तो GetEnumerator कहा जाता है।
और फिर संपत्ति public T this[int index] { } को वर्तमान दृश्य में प्रत्येक आइटम के लिए बुलाया जाता है।

मेरा प्रश्न यह है कि वर्तमान में दिखाई देने वाली वस्तुओं को कैसे प्राप्त करें (डेटा लोड होने के बाद)?

+0

आप यहाँ एक जवाब है: http://stackoverflow.com/questions/11187382/get-listview-visible-items – GameAlchemist

उत्तर

3

कुछ समय पहले मुझे भी एक ही समस्या का सामना करना पड़ा। मुझे सूची बॉक्स के "चयनित इटिम" का उपयोग करके मेरी समस्या का समाधान मिला क्योंकि चयनित आइटम हमेशा दिखाई देगा। मेरे मामले में यह स्क्रॉलिंग था जो समस्या पैदा कर रहा था।
Virtualization issue in listbox

इसके अलावा

- - अगर यह मदद करता है आप देख सकते हैं Virtualization scrollview - Good One

+0

मैं नहीं दिख रहा है यही कारण है कि आइटम चयन स्वचालित रूप से मतलब है कि आइटम दिखाई दे रहा है, यह बहुत अच्छी तरह से चुना जा सकता है लेकिन ध्यान में नहीं। –

+0

:) डेवलपर अब इसका इस्तेमाल कर रहे हैं। – Rohit

1

कुछ इसी तरह पता लगाने की कोशिश के बाद, मैंने सोचा था कि मैं अपने परिणाम यहाँ शेयर करना चाहते हैं (जैसा कि अन्य प्रतिक्रियाओं की तुलना में आसान लगता है):

सरल दृश्यता परीक्षण मुझे here से मिला है।

private static bool IsUserVisible(FrameworkElement element, FrameworkElement container) 
{ 
    if (!element.IsVisible) 
     return false; 

    Rect bounds = 
     element.TransformToAncestor(container).TransformBounds(new Rect(0.0, 0.0, element.ActualWidth, element.ActualHeight)); 
    var rect = new Rect(0.0, 0.0, container.ActualWidth, container.ActualHeight); 
    return rect.Contains(bounds.TopLeft) || rect.Contains(bounds.BottomRight); 
} 

बाद में आप ListBoxItems के माध्यम से लूप और कहा कि परीक्षण का उपयोग यह निर्धारित करने के दिखाई दे रहे हैं कर सकते हैं।

private List<object> GetVisibleItemsFromListbox(ListBox listBox, FrameworkElement parentToTestVisibility) 
{ 
    var items = new List<object>(); 

    foreach (var item in PhotosListBox.Items) 
    { 
     if (IsUserVisible((ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item), parentToTestVisibility)) 
     { 
      items.Add(item); 
     } 
     else if (items.Any()) 
     { 
      break; 
     } 
    } 

    return items; 
} 
संबंधित मुद्दे