2011-05-09 11 views
6

Tengo un ListBox con la propiedad VirtualizingStackPanel.VirtualizationMode establecida en "Reciclaje". Estoy vinculando una colección personalizada (implementa IList y IList<T>) a ella.Obtener elementos a la vista en un cuadro de lista

Ahora, si entiendo bien, cuando se enlazan datos, se llama a GetEnumerator.
Y luego se llama a la propiedad public T this[int index] { } para cada elemento en la vista actual.

Mi pregunta es cómo obtener los artículos que están actualmente visibles (después de cargar los datos)?

+0

Tienes una respuesta aquí: http://stackoverflow.com/questions/11187382/get-listview-visible-items – GameAlchemist

Respuesta

3

En algún momento, también me enfrenté con el mismo problema. Encontré una solución a mi problema utilizando "SelectedItem" de Listbox, ya que el elemento seleccionado siempre sería visible. En mi caso, fue Scrolling el que causaba problemas. Puede echar un vistazo si ayuda -
Virtualization issue in listbox

También - Virtualization scrollview - Good One

+0

no veo por qué la selección elemento significa automáticamente el elemento es visible, podría muy bien ser seleccionado pero no a la vista. –

+0

:). Los desarrolladores ahora están acostumbrados a eso. – Rohit

1

Después de tratar de averiguar algo similar, pensé que iba a compartir mi resultado aquí (como parece más fácil que las otras respuestas):

Prueba de visibilidad simple que recibí de 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); 
} 

después se puede recorrer los ListBoxItems y utilizar esa prueba para determinar cuales son visibles.

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; 
} 
Cuestiones relacionadas