Optimalizace výkonu: Ovládací prvky
Windows Presentation Foundation (WPF) obsahuje řadu běžných komponent uživatelského rozhraní, které se používají ve většině aplikací systému Windows. Toto téma obsahuje techniky pro zlepšení výkonu uživatelského rozhraní.
Zobrazení velkých datových sad
Ovládací prvky WPF, jako jsou například ListView ovládací prvky a ComboBox slouží k zobrazení seznamů položek v aplikaci. Pokud je seznam, který se má zobrazit, velký, může být ovlivněn výkon aplikace. Důvodem je to, že standardní systém rozložení vytvoří kontejner rozložení pro každou položku přidruženou k ovládacímu prvku seznam a vypočítá jeho velikost a pozici rozložení. Obvykle nemusíte zobrazovat všechny položky najednou; místo toho zobrazíte podmnožinu a uživatel se v seznamu posune. V tomto případě je vhodné použít virtualizaci uživatelského rozhraní, což znamená, že generování kontejneru položek a související výpočty rozložení pro položku se odloží, dokud se položka nezobrazí.
Virtualizace uživatelského rozhraní je důležitým aspektem ovládacích prvků seznamu. Virtualizace uživatelského rozhraní by se neměla zaměňovat s virtualizací dat. Virtualizace uživatelského rozhraní ukládá jenom viditelné položky do paměti, ale ve scénáři datové vazby ukládá celou datovou strukturu do paměti. Naproti tomu virtualizace dat ukládá pouze datové položky, které jsou viditelné na obrazovce v paměti.
Ve výchozím nastavení je pro uživatele povolená ListView virtualizace uživatelského rozhraní a ListBox ovládací prvky, když jsou jejich položky seznamu svázané s daty. TreeView virtualizaci lze povolit nastavením VirtualizingStackPanel.IsVirtualizing připojené vlastnosti na true
. Pokud chcete povolit virtualizaci uživatelského rozhraní pro vlastní ovládací prvky odvozené z ItemsControl ovládacích prvků nebo existujících ovládacích prvků položek, které používají StackPanel třídu, například ComboBox, můžete nastavit na VirtualizingStackPanel hodnotu a nastavit ItemsPanelIsVirtualizing na true
. Virtualizaci uživatelského rozhraní pro tyto ovládací prvky bohužel můžete zakázat, aniž byste si ji uvědomili. Následuje seznam podmínek, které zakazují virtualizaci uživatelského rozhraní.
Kontejnery položek jsou přidány přímo do objektu ItemsControl. Pokud například aplikace explicitně přidá ListBoxItem objekty do objektu ListBox, ListBox virtualizuje ListBoxItem objekty.
Kontejnery položek v různých ItemsControl typech. Například objekty používající objekty nelze implementovat recyklaci položek, Menu protože Menu obsahuje objekty typu Separator a MenuItem.Separator
Nastavení CanContentScroll na
false
.Nastavení IsVirtualizing na
false
.
Důležitým aspektem při virtualizaci kontejnerů položek je to, jestli máte k kontejneru položek přidružené další informace o stavu, které patří k položce. V tomto případě je nutné uložit další stav. Můžete mít například položku obsaženou v ovládacím Expander prvku a IsExpanded stav je vázán na kontejner položky, a ne na samotnou položku. Při opětovném použití kontejneru pro novou položku se pro novou položku použije aktuální hodnota IsExpanded . Stará položka navíc ztratí správnou IsExpanded hodnotu.
V současné době žádné ovládací prvky WPF nenabízí integrovanou podporu virtualizace dat.
Recyklace kontejnerů
Optimalizace virtualizace uživatelského rozhraní přidaná do rozhraní .NET Framework 3.5 SP1 pro ovládací prvky, které dědí, ItemsControl je recyklace kontejnerů, což může také zlepšit výkon posouvání. ItemsControl Když se naplní virtualizace uživatelského rozhraní, vytvoří kontejner položek pro každou položku, která se posune do zobrazení, a zničí kontejner položek pro každou položku, která se posune mimo zobrazení. Recyklace kontejneru umožňuje ovládacímu prvku opakovaně používat existující kontejnery položek pro různé datové položky, aby kontejnery položek nebyly neustále vytvořeny a zničeny při posouvání ItemsControluživatelem . Recyklaci položek můžete povolit nastavením VirtualizationMode připojené vlastnosti na Recyclinghodnotu .
Všechny ItemsControl , které podporují virtualizaci, můžou používat recyklaci kontejnerů. Příklad povolení recyklace kontejnerů v ListBoxseznamu naleznete v tématu Zlepšení výkonu posouvání seznamu.
Podpora obousměrné virtualizace
VirtualizingStackPanel nabízí integrovanou podporu virtualizace uživatelského rozhraní v jednom směru, a to vodorovně nebo svisle. Pokud chcete pro ovládací prvky použít obousměrnou virtualizaci, musíte implementovat vlastní panel, který rozšiřuje VirtualizingStackPanel třídu. Třída VirtualizingStackPanel zveřejňuje virtuální metody, jako OnViewportSizeChangedje , LineUp, PageUpa MouseWheelUp. Tyto virtuální metody umožňují zjistit změnu ve viditelné části seznamu a odpovídajícím způsobem ji zpracovat.
Optimalizace šablon
Strom vizuálu obsahuje všechny vizuální prvky v aplikaci. Kromě přímo vytvořených objektů obsahuje také objekty z důvodu rozšíření šablony. Když například vytvoříte objekty Button, získáte ClassicBorderDecorator a ContentPresenter objekty ve vizuálním stromu. Pokud jste neoptimalizovali šablony ovládacích prvků, možná ve vizuálním stromu vytváříte spoustu nadbytečných objektů. Další informace o vizuálním stromu naleznete v tématu Přehled vykreslování grafiky WPF.
Odložené posouvání
Když uživatel přetáhne palec na posuvníku, zobrazení obsahu se ve výchozím nastavení průběžně aktualizuje. Pokud je posouvání ve vašem ovládacím prvku pomalé, zvažte použití odloženého posouvání. Při odložené posouvání se obsah aktualizuje jenom v případě, že uživatel uvolní palec.
Pokud chcete implementovat odložené posouvání, nastavte IsDeferredScrollingEnabled vlastnost na true
hodnotu . IsDeferredScrollingEnabled je připojená vlastnost a lze ji nastavit ScrollViewer a jakýkoli ovládací prvek, který má ScrollViewer v šabloně ovládacího prvku.
Ovládací prvky, které implementují funkce výkonu
Následující tabulka uvádí společné ovládací prvky pro zobrazení dat a jejich podporu funkcí výkonu. Informace o tom, jak tyto funkce povolit, najdete v předchozích částech.
Ctrl | Virtualizace | Recyklace kontejnerů | Odložené posouvání |
---|---|---|---|
ComboBox | Je možné povolit | Je možné povolit | Je možné povolit |
ContextMenu | Je možné povolit | Je možné povolit | Je možné povolit |
DocumentViewer | Není k dispozici | Není k dispozici | Je možné povolit |
ListBox | Výchozí | Je možné povolit | Je možné povolit |
ListView | Výchozí | Je možné povolit | Je možné povolit |
TreeView | Je možné povolit | Je možné povolit | Je možné povolit |
ToolBar | Není k dispozici | Není k dispozici | Je možné povolit |
Poznámka:
Příklad povolení virtualizace a recyklace kontejnerů na objektu TreeView, naleznete v tématu Zlepšení výkonu TreeView.
Viz také
.NET Desktop feedback