Dwukrotne pytanie tutaj, ale myślę, że te dwa tematy są wystarczająco powiązane, aby zagwarantować ich integrację.Jak przyspieszyć renderowanie ListBox i filtrowanie ListCollectionView?
W naszej aplikacji mamy ListBox
, który jest wypełniony dużą liczbą elementów. Każdy z tych elementów jest wyświetlany z dość skomplikowanym szablonem przedmiotów. Jest to z pewnością dość skomplikowane i chociaż można by je nieco zmniejszyć, prawdopodobnie nie mógłbym wydobyć ogromnej ilości. Elementy w ListBox
pochodzą z ListCollectionView
, który jest zbudowany z ObservableCollection<>
obiektów do wyświetlenia.
Mamy dwa problemy.
Pierwszym jest to, że kiedy ponownie skonfigurować filtry dla ListCollectionView
Refresh
i zadzwonić na nim, jest bardzo wyczuwalny lock-up na kilka sekund w interfejsie użytkownika podczas jego rozebrany i ponownie, a ListBox
ponownie wypełnia. Czas trwania tego blokowania wydaje się być związany z liczbą elementów zawartych w ListBox
i jest najdłuższy, gdy obszar roboczy ListBox
jest pełen elementów. Jesteśmy prawie pewni, że blokada jest spowodowana odtworzeniem szablonów przedmiotów. Próbowałem włączyć wirtualizację, ale nie miało to wpływu na zmniejszenie lub wyeliminowanie spowolnienia. Patrzę również na inne optymalizacje, takie jak sprawdzanie naszych wiązań i modyfikowanie układów. Czy istnieje sposób na uniknięcie tego konkretnego problemu, przyspieszenie lub przeniesienie go do innego wątku? (Wiem, że ostatnia z nich jest bardzo mało prawdopodobna, ponieważ renderowanie jest jednoniciowe, ale być może jest pewne obejście ...)
Druga odnosi się do filtrowania na ListCollectionView
. Chociaż nie jest to obecnie problemem, uważamy, że istnieje możliwość, że filtrowanie stanie się problemem i spowoduje zauważalne blokowanie wątku interfejsu użytkownika. Pracuję nad zmniejszeniem kosztów filtrowania, ale zastanawiałem się, czy istnieje metoda przenoszenia wywołania funkcji Odśwież na ListCollectionView
na inny wątek? Żadna z moich dotychczasowych prób nie odniosła sukcesu, pozornie dlatego, że ListCollectionView
nie automatycznie steruje określonymi zdarzeniami we właściwym wątku.
Bardzo pomocne byłyby wskazówki i wyjaśnienia wszelkich znanych lub potencjalnych rozwiązań tych dwóch problemów.
Mam ten sam problem z moim projektem wpf. Znalazłeś rozwiązanie ? –
Minęło trochę czasu. Wydaje mi się, że pamiętamy, że agresywnie zoptymalizowaliśmy szablon i zrefactowaliśmy filtrowanie, aby przenieść większość do innego wątku. To spowodowało, że blokowanie było znacznie mniej zauważalne. Niestety od tamtej pory zmieniłem pracę, więc nie wiem, czy wykonano jakąś dalszą pracę. Możliwe, że przełączyli się na kontrolę typu "ListBox" innej firmy, która działa lepiej - zrobiliśmy to dla naszych sieci. –