Как я могу ускорить рендеринг ListBox и фильтрацию ListCollectionView? - PullRequest
6 голосов
/ 21 июня 2011

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

В нашем приложении у нас есть ListBox, который заполнен тем, что может бытьбольшое количество предметов.Каждый из этих элементов отображается с довольно сложным шаблоном элемента.Это, безусловно, довольно сложно, и, хотя его потенциально можно немного сократить, я, вероятно, не смогу вынести огромную сумму.Элементы в ListBox взяты из ListCollectionView, который составлен из ObservableCollection<> объектов для отображения.

У нас есть две проблемы.

Во-первых, когда мыперенастроить фильтры для ListCollectionView и вызвать на нем Refresh, в пользовательском интерфейсе наблюдается очень заметная блокировка на несколько секунд, пока он сносится и воссоздается, а ListBox заполняется заново.Длительность этой блокировки, по-видимому, связана с количеством элементов, содержащихся в ListBox, и является самой длинной, когда клиентская область ListBox заполнена элементами.Мы уверены, что причиной блокировки является воссоздание шаблонов элементов.Я попытался включить виртуализацию, но это никак не повлияло на уменьшение или устранение замедления.Я также смотрю на некоторые другие оптимизации, такие как изучение наших привязок и изменение макетов.Есть ли способ избежать этой конкретной проблемы, ускорить ее или перенести в другой поток?(Я знаю, что последнее маловероятно, потому что рендеринг является однопоточным, но, возможно, есть какой-то обходной путь ...)

Второй относится к фильтрации на ListCollectionView.Хотя в настоящее время это не проблема, мы думаем, что существует вероятность того, что фильтрация станет проблемой и вызовет заметную блокировку потока пользовательского интерфейса.Я работаю над уменьшением затрат на фильтрацию, но мне было интересно, есть ли метод для перемещения вызова Refresh на ListCollectionView в другой поток?До сих пор ни одна из моих попыток не увенчалась успехом, по-видимому, потому что ListCollectionView автоматически не направляет определенные события в правильный поток.

Указатели или объяснения любых известных или потенциальных решений этих двух проблем будуточень полезно.

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

Некоторые интересные идеи в этой SO ветке о рендеринге и связывании сетки данных - вы можете также применить их к вашему сценарию со списком ...

2 голосов
/ 21 июня 2011

Я не думаю, что вы можете виртуализировать И фильтровать одновременно. Поэтому, если бы я был на вашем месте, я бы придерживался списка виртуализации и выполнял логику фильтрации в другом потоке. Конечно, вам, возможно, придется написать некоторый код, который уже был написан ранее, но если он не блокирует ваш графический интерфейс? Стоит того.

1 голос
/ 21 июня 2011

2 подсказок из здесь , первый может помочь для виртуализации ListBox:

Виртуализация списков и представлений с использованием VirtualizingStackPanel в качестве ItemsPanel для списков.Это создает только видимые элементы во время загрузки.Все остальные элементы создаются ленивыми, когда они становятся видимыми.Имейте в виду, что группировка или CanContentScroll="True" предотвращает виртуализацию!

Включите утилизацию контейнера.Виртуализация приносит много улучшений производительности, но контейнеры будут удалены и созданы заново, это значение по умолчанию.Но вы можете повысить производительность, перезапуская контейнеры, установив VirtualizingStackPanel.VirtualizationMode="Recycling"

Я сделал виртуализацию своего огромного списка объектов по методике, описанной здесь на codeproject , она прекрасно работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...