Получить элементы в списке внутри списка - PullRequest
7 голосов
/ 09 мая 2011

У меня есть ListBox со свойством VirtualizingStackPanel.VirtualizationMode, установленным в «Переработка».Я привязываю к нему собственную коллекцию (реализует IList и IList<T>).

Теперь, если я правильно понимаю, когда данные связаны, вызывается GetEnumerator.
И затем для каждого элемента в текущем представлении вызывается свойство public T this[int index] { }

Мой вопрос: как получить элементы, которые в данный момент видны (после загрузки данных)?

Ответы [ 2 ]

3 голосов
/ 09 мая 2011

Некоторое время назад я тоже столкнулся с той же проблемой.Я нашел решение моей проблемы, используя «SelectedItem» из списка, так как выбранный элемент будет виден всегда.В моем случае это была прокрутка, которая вызывала проблему.Вы можете посмотреть, поможет ли это -
Проблема виртуализации в списке

Также - Скроллинг виртуализации - Good One

1 голос
/ 28 сентября 2012

После попытки выяснить что-то подобное, я подумал, что поделюсь своим результатом здесь (как это кажется легче, чем другие ответы):

Простой тест видимости, который я получил от здесь .

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...