У меня есть класс под названием Book;
class Book
{
public string Name { get; set; }
public string Author { get; set; }
public int PagesCount { get; set; }
public int Category { get; set; }
}
В ListBox отображается список книг, а шаблон ItemTemplate был изменен для визуального представления книги. Текст показывает название книги, автора и количество страниц. Категория, однако, представлена определенным цветом (например, история синего цвета, романтика красного цвета и т. Д.). Теперь текст имеет эффект OuterGlowBitmap и преобразователь значений из категории (int) в соответствующий цвет. Все связано в DataTemplate для ListBoxItem. Технически все работает отлично.
Проблема, однако, в производительности. Кажется, что эффект растрового изображения externalGlow сильно влияет на процессор, поэтому, когда у меня есть список из 500 книг, для извлечения данных из базы данных требуется около 500 мс, но для загрузки элементов в ListBox требуется около 10 секунд. И даже когда загрузка завершена, прокрутка очень запаздывает. Я попытался установить для VirtualizingStackPanel.IsVirtualizing значение True, но безрезультатно. (Максимальное количество книг, которые могут находиться в базе данных в любой момент времени, составляет около 30000.)
Однако, даже если в списке больше 100 элементов, человеческий разум не может обработать так быстро, поэтому я не ставлю перед собой цель загрузить и перечислить пользователю все книги, которые искали. Вот почему я создал класс-оболочку навигации BookNavigator, который фактически связывает список со своим объектом ObservableCollection. Все книги загружены в этот BookNavigator, но только X из них отображаются в списке (добавляя их в коллекцию observableCollection).
Проблема в том, что я хочу, чтобы количество отображаемых книг было достаточно маленьким, чтобы в списке не отображалась полоса прокрутки, чтобы я мог реализовать свои собственные методы прокрутки (Первый, Предыдущий, Следующий, Последний или просто мой собственный). полоса прокрутки, не имеет значения).
Как рассчитать количество отображаемых элементов, чтобы полоса прокрутки не отображалась?
Две проблемы, которые всплывают: - Изменение размера приложения может изменить размер списка
- Не все элементы списка имеют одинаковую высоту (в зависимости от количества авторов).
Есть ли способ достичь того, что я пытаюсь сделать?
РЕДАКТИРОВАТЬ (в ответ на Мартин Харрис)
Проблема с кодом, предложенным Мартином Харрисом, состоит в том, что цикл foreach использует FrameworkElement, но список заполнен объектами типа Book, которые не наследуются от FrameworkElement, и не имеет другого способа вычисления его высоты. Корневым элементом ListBoxItem является сетка, так что, возможно, можно будет восстановить эту сетку, но я не знаю, как это сделать?
Есть ли вообще способ получить фактические элементы пользовательского интерфейса, которые создаются для представления элемента списка?
EDIT
Я нашел этот Q / A, который, кажется, то, что мне нужно ..
ItemContainerGenerator