2011-05-09 23 views
6

VirtualizingStackPanel.VirtualizationMode özelliği "Recycling" olarak ayarlanmış bir ListBox'ım var. Özel bir koleksiyona (IList ve IList<T> uygular) bağlanıyorum.Ürününüzü bir liste içinde görüntüleyin

Şimdi, eğer doğru anlarsam, veri bağlı olduğunda GetEnumerator çağrılır.
Geçerli görünümdeki her öğe için public T this[int index] { } özelliği çağrılır.

Sorum şu anda görünür durumda olan öğeleri nasıl alacağınızdır (veri yüklendikten sonra)?

+0

Burada bir cevap: öğe seçimi otomatik öğeyi görünür olduğu anlamına gelir neden http://stackoverflow.com/questions/11187382/get-listview-visible-items – GameAlchemist

cevap

3

Bazen de aynı sorunla karşılaştım. Seçili öğe her zaman görünür olacağından, Listbox'ın "SelectedItem" özelliğini kullanarak bir sorunumun geçici çözümünü buldum. Benim durumumda, soruna neden olan Scrolling idi. : - Ayrıca
Virtualization issue in listbox

- Virtualization scrollview - Good One

+0

görmüyorum, bu Çok iyi seçilebilir ama görünmüyor olabilir. –

+0

:) Geliştiriciler artık bunun için kullanılıyor. – Rohit

1

benzer bir şey anlamaya çalışıyorum sonra (diğer yanıtların daha kolay görünüyor gibi) Benim burada sonucunu paylaşmak istedim, o yardımcı olur eğer bir göz atabilirsiniz

Basit görünürlük testi here'dan aldım.

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); 
} 

Sonrasında ListBoxItems döngü ve görebilir belirlemek için bu testi kullanılabilir.

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; 
} 
İlgili konular