Как я могу ускорить рендеринг ListBox и фильтрацию ListCollectionView?

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

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

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

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

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

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

6
задан Chris Mantle 28 November 2013 в 15:27
поделиться