Udostępnij za pośrednictwem


Optymalizowanie wydajności: kontrolki

Program Windows Presentation Foundation (WPF) zawiera wiele typowych składników interfejsu użytkownika, które są używane w większości aplikacji systemu Windows. Ten temat zawiera techniki poprawy wydajności interfejsu użytkownika.

Wyświetlanie dużych zestawów danych

Kontrolki WPF, takie jak ListView i ComboBox, są używane do wyświetlania list elementów w aplikacji. Jeśli lista do wyświetlenia jest duża, może to mieć wpływ na wydajność aplikacji. Dzieje się tak, ponieważ standardowy system układów tworzy kontener układu dla każdego elementu skojarzonego z kontrolką listy i oblicza jego rozmiar i położenie układu. Zazwyczaj nie trzeba jednocześnie wyświetlać wszystkich elementów; zamiast tego zostanie wyświetlony podzbiór, a użytkownik przewija listę. W tym przypadku warto użyć wirtualizacji UI , co oznacza, że generowanie kontenera elementów i skojarzone obliczenia układu dla elementu są opóźnione, aż element stanie się widoczny.

Wirtualizacja interfejsu użytkownika jest ważnym aspektem kontrolek listy. Wirtualizacja interfejsu użytkownika nie powinna być mylona z wirtualizacją danych. Wirtualizacja interfejsu użytkownika przechowuje tylko widoczne elementy w pamięci, ale w scenariuszu powiązania danych przechowuje całą strukturę danych w pamięci. Natomiast wirtualizacja danych przechowuje tylko elementy danych widoczne na ekranie w pamięci.

Domyślnie wirtualizacja interfejsu użytkownika jest włączona dla kontrolki ListView i ListBox, gdy ich elementy listy są powiązane z danymi. Wirtualizację TreeView można włączyć, ustawiając dołączoną właściwość VirtualizingStackPanel.IsVirtualizing na true. Jeśli chcesz włączyć wirtualizację interfejsu użytkownika dla kontrolek niestandardowych, które pochodzą z ItemsControl lub istniejących kontrolek elementów używających klasy StackPanel, takich jak ComboBox, możesz ustawić ItemsPanel na VirtualizingStackPanel i ustawić IsVirtualizing na wartość true. Niestety, można wyłączyć wirtualizację interfejsu użytkownika dla tych kontrolek, nie zdając sobie z tego sprawy. Poniżej znajduje się lista warunków wyłączających wirtualizację interfejsu użytkownika.

Ważną kwestią podczas wirtualizacji kontenerów elementów jest to, czy masz dodatkowe informacje o stanie skojarzone z kontenerem elementów, który należy do elementu. W takim przypadku należy zapisać dodatkowy stan. Na przykład może istnieć element zawarty w kontrolce Expander, a stan IsExpanded jest powiązany z kontenerem elementu, a nie z samym elementem. Gdy kontener jest ponownie używany dla nowego elementu, bieżąca wartość IsExpanded jest używana dla nowego elementu. Ponadto stary element traci poprawną wartość IsExpanded.

Obecnie żadne kontrolki WPF nie oferują wbudowanej obsługi wirtualizacji danych.

Recykling kontenerów

Optymalizacja wirtualizacji interfejsu użytkownika dodana w programie .NET Framework 3.5 SP1 dla kontrolek dziedziczących po ItemsControl to recykling kontenerów, co również może zwiększyć wydajność przewijania. Gdy ItemsControl używająca wirtualizacji interfejsu użytkownika jest wypełniona, tworzy kontener elementów dla każdego elementu, który przewija się do pola widoku, i niszczy kontener elementów dla każdego elementu, który przewija się poza pole widoku. recyklingu kontenerów kontenerów umożliwia ponowne użycie istniejących kontenerów elementów dla różnych elementów danych, dzięki czemu kontenery elementów nie są stale tworzone i niszczone, gdy użytkownik przewija ItemsControl. Możesz włączyć recykling elementów, ustawiając właściwość dołączoną VirtualizationMode na Recycling.

Każde ItemsControl, które obsługuje wirtualizację, może używać recyklingu kontenerów. Aby zapoznać się z przykładem włączania recyklingu kontenerów w ListBox, zobacz Poprawianie wydajności przewijaniaListBox.

Obsługa wirtualizacji dwukierunkowej

VirtualizingStackPanel oferuje wbudowaną obsługę wirtualizacji interfejsu użytkownika w jednym kierunku, zarówno w poziomie, jak i w pionie. Jeśli chcesz użyć wirtualizacji dwukierunkowej dla kontrolek, musisz zaimplementować niestandardowy panel rozszerzający klasę VirtualizingStackPanel. Klasa VirtualizingStackPanel udostępnia metody wirtualne, takie jak OnViewportSizeChanged, LineUp, PageUpi MouseWheelUp. Te metody wirtualne umożliwiają wykrywanie zmian w widocznej części listy i odpowiednie obsługiwanie jej.

Optymalizowanie szablonów

Drzewo wizualizacji zawiera wszystkie elementy wizualne w aplikacji. Oprócz utworzonych bezpośrednio obiektów zawiera również obiekty spowodowane rozszerzeniem szablonu. Na przykład podczas tworzenia Buttonuzyskasz również obiekty ClassicBorderDecorator i ContentPresenter w drzewie wizualnym. Jeśli szablony kontrolek nie zostały zoptymalizowane, możesz utworzyć wiele dodatkowych niepotrzebnych obiektów w drzewie wizualizacji. Aby uzyskać więcej informacji na temat drzewa wizualnego, zobacz Omówienie renderowania grafiki WPF.

Przewijanie odroczone

Domyślnie gdy użytkownik przeciąga kciuk na pasek przewijania, widok zawartości jest stale aktualizowany. Jeśli przewijanie działa wolno w twojej kontrolce, rozważ użycie przewijania z opóźnieniem. Podczas odroczonego przewijania zawartość jest aktualizowana tylko wtedy, gdy użytkownik zwolni kciuk.

Aby zaimplementować opóźnione przewijanie, ustaw właściwość IsDeferredScrollingEnabled na wartość true. IsDeferredScrollingEnabled jest dołączoną właściwością i można ustawić w ScrollViewer oraz w dowolnej kontrolce, która ma ScrollViewer w szablonie kontrolki.

Kontrolki implementujące funkcje wydajności

W poniższej tabeli wymieniono typowe kontrolki służące do wyświetlania danych i ich obsługi funkcji wydajności. Zapoznaj się z poprzednimi sekcjami, aby uzyskać informacje na temat włączania tych funkcji.

Kontrola Wirtualizacja Recykling kontenerów Przewijanie odroczone
ComboBox Można włączyć Można włączyć Można włączyć
ContextMenu Można włączyć Można włączyć Można włączyć
DocumentViewer Niedostępne Niedostępne Można włączyć
ListBox Domyślny Można włączyć Można włączyć
ListView Domyślny Można włączyć Można włączyć
TreeView Można włączyć Można włączyć Można włączyć
ToolBar Niedostępne Niedostępne Można włączyć

Uwaga

Aby zapoznać się z przykładem, jak włączyć wirtualizację i recykling kontenerów w TreeView, zobacz Poprawianie wydajności TreeView.

Zobacz też