Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Windows Presentation Foundation (WPF) innehåller många av de vanliga användargränssnittskomponenterna (UI) som används i de flesta Windows-program. Det här avsnittet innehåller tekniker för att förbättra prestandan för användargränssnittet.
Visa stora datamängder
WPF-kontroller som ListView och ComboBox används för att visa listor över objekt i ett program. Om listan som ska visas är stor kan programmets prestanda påverkas. Detta beror på att standardlayoutsystemet skapar en layoutcontainer för varje objekt som är associerat med listkontrollen och beräknar dess layoutstorlek och position. Normalt behöver du inte visa alla objekt samtidigt. i stället visar du en delmängd och användaren bläddrar igenom listan. I det här fallet är det klokt att använda virtualisering av användargränssnittet, vilket innebär att genereringen av objektcontainern och tillhörande layoutberäkning för ett objekt skjuts upp tills objektet visas.
Virtualisering av användargränssnitt är en viktig aspekt av listkontroller. Virtualisering av användargränssnittet bör inte förväxlas med datavirtualisering. Virtualisering av användargränssnittet lagrar endast synliga objekt i minnet, men i ett databindningsscenario lagras hela datastrukturen i minnet. Däremot lagrar datavirtualisering endast de dataobjekt som visas på skärmen i minnet.
Som standard aktiveras virtualisering av användargränssnittet för ListView- och ListBox-kontrollerna när deras listobjekt är bundna till data.
TreeView virtualisering kan aktiveras genom att ange den VirtualizingStackPanel.IsVirtualizing anslutna egenskapen till true
. Om du vill aktivera virtualisering av användargränssnittet för anpassade kontroller som härleds från ItemsControl eller befintliga objektkontroller som använder StackPanel klassen, till exempel ComboBox, kan du ange ItemsPanel till VirtualizingStackPanel och ange IsVirtualizing till true
. Tyvärr kan du inaktivera virtualisering av användargränssnittet för dessa kontroller utan att inse det. Följande är en lista över villkor som inaktiverar virtualisering av användargränssnittet.
Objektcontainrar läggs till direkt i ItemsControl. Till exempel, om ett program uttryckligen lägger till objekt ListBoxItem i en ListBox, så virtualiserar inte ListBoxListBoxItem-objekten.
Objektcontainrar i ItemsControl är av olika typer. Till exempel kan en Menu som använder Separator-objekt inte implementera återvinning av objekt eftersom Menu innehåller objekt av typen Separator och MenuItem.
Inställning CanContentScroll till
false
.Inställning IsVirtualizing till
false
.
Ett viktigt övervägande när du virtualiserar objektcontainrar är om du har ytterligare tillståndsinformation som är associerad med en objektcontainer som tillhör objektet. I det här fallet måste du spara det extra tillståndet. Du kan till exempel ha ett objekt som finns i en Expander kontroll och tillståndet är bundet IsExpanded till objektets container och inte till själva objektet. När containern återanvänds för ett nytt objekt används det aktuella värdet IsExpanded för det nya objektet. Dessutom förlorar det gamla objektet rätt IsExpanded värde.
För närvarande har inga WPF-kontroller inbyggt stöd för datavirtualisering.
Återvinning av containrar
En optimering av UI-virtualisering som lagts till i .NET Framework 3.5 SP1 för kontroller som ärver från ItemsControl är containeråtervinning, vilket också kan förbättra rullningsprestanda. När en ItemsControl som använder UI-virtualisering fylls i skapar den en objektcontainer för varje objekt som rullar in i vyn och förstör objektcontainern för varje objekt som rullar ur vyn. Med återanvändning av containrar kan kontrollen återanvända befintliga objektcontainrar för olika dataobjekt, så att objektcontainrar inte hela tiden skapas och förstörs när användaren rullar ItemsControl. Du kan välja att aktivera återvinning av objekt genom att ange den VirtualizationMode anslutna egenskapen till Recycling.
Alla ItemsControl som stöder virtualisering kan använda containeråtervinning. Ett exempel på hur du aktiverar containeråtervinning på en ListBoxfinns i Förbättra rullningsprestanda för en ListBox.
Stöd för dubbelriktad virtualisering
VirtualizingStackPanel erbjuder inbyggt stöd för virtualisering av användargränssnittet i en riktning, antingen vågrätt eller lodrätt. Om du vill använda dubbelriktad virtualisering för dina kontroller måste du implementera en anpassad panel som utökar VirtualizingStackPanel klassen. Klassen VirtualizingStackPanel exponerar virtuella metoder som OnViewportSizeChanged, LineUp, PageUpoch MouseWheelUp. Med de här virtuella metoderna kan du identifiera en ändring i den synliga delen av en lista och hantera den i enlighet med detta.
Optimera mallar
Det visuella trädet innehåller alla visuella element i ett program. Förutom de objekt som skapas direkt innehåller den även objekt på grund av mallexpansion. När du till exempel skapar ett Button-objekt, får du även ClassicBorderDecorator- och ContentPresenter-objekt i det visuella trädet. Om du inte har optimerat dina kontrollmallar kanske du skapar många extra onödiga objekt i det visuella trädet. Mer information om det visuella trädet finns i ÖVERSIKT över WPF-grafikrendering.
Uppskjuten rullning
När användaren drar tummen i en rullningslist uppdateras innehållsvyn som standard kontinuerligt. Om rullningen är långsam i kontrollen kan du överväga att använda uppskjuten rullning. Vid uppskjuten rullning uppdateras innehållet endast när användaren släpper tummen.
Om du vill implementera uppskjuten rullning anger du egenskapen IsDeferredScrollingEnabled till true
.
IsDeferredScrollingEnabled är en bifogad egenskap och kan anges på ScrollViewer och alla kontroller som har en ScrollViewer i sin kontrollmall.
Kontroller som implementerar prestandafunktioner
I följande tabell visas de vanliga kontrollerna för att visa data och deras stöd för prestandafunktioner. Se föregående avsnitt för information om hur du aktiverar dessa funktioner.
Kontroll | Virtualisering | Återvinning av containrar | Uppskjuten rullning |
---|---|---|---|
ComboBox | Kan aktiveras | Kan aktiveras | Kan aktiveras |
ContextMenu | Kan aktiveras | Kan aktiveras | Kan aktiveras |
DocumentViewer | Ej tillgänglig | Ej tillgänglig | Kan aktiveras |
ListBox | Förinställning | Kan aktiveras | Kan aktiveras |
ListView | Förinställning | Kan aktiveras | Kan aktiveras |
TreeView | Kan aktiveras | Kan aktiveras | Kan aktiveras |
ToolBar | Ej tillgänglig | Ej tillgänglig | Kan aktiveras |
Anmärkning
Ett exempel på hur du aktiverar virtualisering och containeråtervinning på en TreeViewfinns i Förbättra prestanda för en TreeView.
Se även
.NET Desktop feedback