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í.

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 truehodnotu . 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é