ListBox, VirtualizingStackPanel и плавная прокрутка в WPF

У меня есть ListBox, в котором может быть много строк шаблонных записей БД, в том числе Image, привязанных к ObservableCollection<MyItem>. Иногда коллекция могла вместить тысячи предметов.

Производительность отличная, но прокрутка по умолчанию дергается. Я бы хотел, чтобы прокрутка была плавной, поэтому снял флажок ScrollViewer.CanContentScroll.

Теперь у меня плавная прокрутка, но производительность ужасная: данные извлекаются в отдельном потоке, и поток завершается быстро, но для отображения результатов в ListBox требуется 10-20 секунд. Я предполагаю, что это связано с тем, что снятие флажка ScrollViewer.CanContentScroll изменяет базовый VirtualizingStackPanel на обычный StackPanel и поэтому загружает всю коллекцию перед отображением результатов.

Итак, у меня такой вопрос: как сохранить плавную прокрутку, не жертвуя поведением и производительностью VirtualizingStackPanel?


person Joel Cochran    schedule 17.12.2009    source источник
comment
У вас может быть как плавная прокрутка, так и виртуализация, если вы готовы немного взломать. См. этот ответ на аналогичный вопрос для подробностей.   -  person Samuel Jack    schedule 26.03.2012
comment
stackoverflow.com/questions/1977929/ VirtualizingPanel.ScrollUnit = Pixel   -  person Guillaume    schedule 20.11.2012


Ответы (2)


Когда вы снимаете флажок CanContentScroll, вы теряете виртуализацию. И ответ действительно разочаровывает: на данный момент нет готового решения :(.

PS: Это не первая публикация здесь с вопросом именно этот вопрос.

person Anvaka    schedule 17.12.2009
comment
Я боялся этого, но должен был спросить. Я искал перед тем, как спросить, но не нашел того сообщения. Я мог бы копать еще немного, но время ограничено, поэтому мне пока придется отказаться от Smooth Scrolling. - person Joel Cochran; 18.12.2009

Если вы используете .NET 4.5 (или 4.0, если хотите немного взломать), то ответ есть здесь.

[Обратите внимание, что комментарий @ Guilluame был здесь задолго до этого ответа, но он не был особенно заметен при поиске ответов.]

person Zodman    schedule 02.11.2015