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żą 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 takim przypadku warto użyć wirtualizacji interfejsu użytkownika, co oznacza, że generowanie kontenera elementów i skojarzone obliczenia układu dla elementu są odroczone do momentu, aż element będzie 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 ListView użytkownika jest włączona dla kontrolek i ListBox , gdy ich elementy listy są powiązane z danymi. TreeView Wirtualizację można włączyć, ustawiając dołączoną VirtualizingStackPanel.IsVirtualizing właściwość na true
wartość . Jeśli chcesz włączyć wirtualizację interfejsu użytkownika dla kontrolek niestandardowych, które pochodzą z istniejących kontrolek elementów korzystających z ItemsControl klasy, takich jak ComboBox, możesz ustawić wartość na i ustawić VirtualizingStackPanelItemsPanel wartość IsVirtualizingtrue
.StackPanel Niestety, można wyłączyć wirtualizację interfejsu użytkownika dla tych kontrolek bez jego realizacji. Poniżej znajduje się lista warunków wyłączających wirtualizację interfejsu użytkownika.
Kontenery elementów są dodawane bezpośrednio do elementu ItemsControl. Jeśli na przykład aplikacja jawnie dodaje ListBoxItem obiekty do ListBoxobiektu , ListBox obiekt nie wirtualizuje ListBoxItem obiektów.
Kontenery elementów w elemencie ItemsControl mają różne typy. Na przykład obiekt Menu używający Separator obiektów nie może zaimplementować recyklingu elementów, ponieważ Menu obiekt zawiera obiekty typu Separator i MenuItem.
Ustawienie CanContentScroll na
false
.Ustawienie IsVirtualizing na
false
.
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 IsExpanded stan 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ą IsExpanded wartość.
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 z ItemsControl kontenerów może również zwiększyć wydajność przewijania. ItemsControl Po wypełnieniu wirtualizacji interfejsu użytkownika tworzony jest kontener elementów dla każdego elementu, który przewija się do widoku i niszczy kontener elementów dla każdego elementu, który przewija się poza widok. Odtwarzanie kontenerów umożliwia kontrolce 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 ItemsControlelement . Możesz włączyć odtwarzanie elementów, ustawiając dołączoną VirtualizationMode właściwość na Recyclingwartość .
Każdy ItemsControl , który obsługuje wirtualizację, może używać recyklingu kontenerów. Aby zapoznać się z przykładem włączania recyklingu kontenerów w obiekcie ListBox, zobacz Poprawianie wydajności przewijania pola ListBox.
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żywać wirtualizacji dwukierunkowej dla kontrolek, musisz zaimplementować niestandardowy panel, który rozszerza 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 obiektu Button, uzyskujesz ClassicBorderDecorator również obiekty 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 wizualizacji, 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 kontrolce, rozważ użycie przewijania odroczonego. Podczas odroczonego przewijania zawartość jest aktualizowana tylko wtedy, gdy użytkownik zwolni kciuk.
Aby zaimplementować opóźnione przewijanie, ustaw IsDeferredScrollingEnabled właściwość na true
wartość . IsDeferredScrollingEnabled jest dołączoną właściwością i można go ustawić i ScrollViewer dowolną kontrolkę ScrollViewer , która ma element 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.
Kontrolka | 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ępny | Niedostępny | Można włączyć |
ListBox | Wartość domyślna | Można włączyć | Można włączyć |
ListView | Wartość domyślna | Można włączyć | Można włączyć |
TreeView | Można włączyć | Można włączyć | Można włączyć |
ToolBar | Niedostępny | Niedostępny | Można włączyć |
Uwaga
Aby zapoznać się z przykładem włączania wirtualizacji i recyklingu kontenerów w obiekcie TreeView, zobacz Poprawianie wydajności elementu TreeView.
Zobacz też
.NET Desktop feedback