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.
Utformningen av WPF-programmet kan påverka dess prestanda genom att skapa onödiga kostnader vid beräkning av layout och validering av objektreferenser. Skapandet av objekt, särskilt vid körtid, kan påverka applikationens prestandaegenskaper.
Det här avsnittet innehåller prestandarekommendationer inom dessa områden.
Utformning
Termen "layout-pass" beskriver processen att mäta och ordna medlemmarna i samlingen av barnobjekt av ett Panel-härlett objekt, och sedan rita dem på skärmen. Layoutpasset är en matematiskt intensiv process – ju fler element i samlingen, desto fler beräkningar krävs. Varje gång ett underordnat UIElement objekt i samlingen till exempel ändrar sin position kan det utlösa ett nytt pass av layoutsystemet. På grund av den nära relationen mellan objektegenskaper och layoutbeteende är det viktigt att förstå vilken typ av händelser som kan anropa layoutsystemet. Din applikation kommer att prestera bättre genom att så mycket som möjligt minska onödiga anrop av layoutpasset.
Layoutsystemet slutför två pass för varje barnmedlem i en samling: ett mätpass och ett arrangemangspass. Varje underordnat objekt tillhandahåller en egen överriden implementering av Measure och Arrange-metoderna för att ge ett eget specifikt layoutbeteende. Som enklast är layout ett rekursivt system som leder till att ett element storleksanpassas, placeras och ritas på skärmen.
Ett underordnat UIElement objekt påbörjar layoutprocessen genom att först se till att dess kärnegenskaper mäts.
Objektets FrameworkElement egenskaper som är relaterade till storlek, till exempel Width, Heightoch Margin, utvärderas.
Panel-specifik logik tillämpas, till exempel egenskapen Dock för DockPanel, eller egenskapen Orientation för StackPanel.
Innehållet ordnas eller placeras efter att alla barnobjekt har blivit mätta.
Samlingen av barnaobjekt dras till skärmen.
Layoutpassprocessen anropas igen om någon av följande åtgärder inträffar:
Ett barnobjekt läggs till i samlingen.
A LayoutTransform tillämpas på barnobjektet.
Metoden UpdateLayout anropas för det underordnade objektet.
När en ändring sker i värdet för en beroendeegenskap som är markerad med metadata som påverkar måttet eller ordnar pass.
Använd den mest effektiva panelen där det är möjligt
Komplexiteten i layoutprocessen baseras direkt på layoutbeteendet för Panel-härledda element som du använder. En Grid-kontroll eller StackPanel-kontroll ger till exempel mycket mer funktionalitet än en Canvas-kontroll. Priset för den här större ökningen av funktionaliteten är en större ökning av prestandakostnaderna. Men om du inte behöver de funktioner som en Grid kontroll tillhandahåller bör du använda de billigare alternativen, till exempel en Canvas eller en anpassad panel.
Mer information finns i översikten över paneler.
Uppdatera i stället för att ersätta en RenderTransform
Du kanske kan uppdatera en Transform i stället för att ersätta den som värdet för en RenderTransform egenskap. Detta gäller särskilt i scenarier som omfattar animering. Genom att uppdatera en befintlig Transformundviker du att initiera en onödig layoutberäkning.
Bygg ditt träd Top-Down
När en nod läggs till eller tas bort från det logiska trädet genereras egenskaps invalidiseringar på nodens överordnade och alla dess underordnade. Därför bör ett uppifrån och ned-konstruktionsmönster alltid följas för att undvika kostnaden för onödiga ogiltigförklaringar på noder som redan har verifierats. I följande tabell visas skillnaden i körningshastighet mellan att skapa ett träd uppifrån och ned jämfört med nedifrån och upp, där trädet är 150 nivåer djupt med en enda TextBlock och DockPanel på varje nivå.
| Åtgärd | Trädbyggnad (i millisekunder) | Rendering – inkluderar trädstrukturuppbyggnad (i ms) |
|---|---|---|
| Nedifrån och upp | 366 | 454 |
| Uppifrån och ned | 11 | 96 |
Följande kodexempel visar hur du skapar ett träd uppifrån och ned.
private void OnBuildTreeTopDown(object sender, RoutedEventArgs e)
{
TextBlock textBlock = new TextBlock();
textBlock.Text = "Default";
DockPanel parentPanel = new DockPanel();
DockPanel childPanel;
myCanvas.Children.Add(parentPanel);
myCanvas.Children.Add(textBlock);
for (int i = 0; i < 150; i++)
{
textBlock = new TextBlock();
textBlock.Text = "Default";
parentPanel.Children.Add(textBlock);
childPanel = new DockPanel();
parentPanel.Children.Add(childPanel);
parentPanel = childPanel;
}
}
Private Sub OnBuildTreeTopDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim textBlock As New TextBlock()
textBlock.Text = "Default"
Dim parentPanel As New DockPanel()
Dim childPanel As DockPanel
myCanvas.Children.Add(parentPanel)
myCanvas.Children.Add(textBlock)
For i As Integer = 0 To 149
textBlock = New TextBlock()
textBlock.Text = "Default"
parentPanel.Children.Add(textBlock)
childPanel = New DockPanel()
parentPanel.Children.Add(childPanel)
parentPanel = childPanel
Next i
End Sub
Mer information om det logiska trädet finns i Träd i WPF.
Se även
.NET Desktop feedback