Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Het ontwerp van uw WPF-toepassing kan van invloed zijn op de prestaties door onnodige overhead te creëren bij het berekenen van lay-out en het valideren van objectverwijzingen. De constructie van objecten, met name tijdens runtime, kan van invloed zijn op de prestatiekenmerken van uw toepassing.
In dit onderwerp vindt u aanbevelingen voor prestaties op deze gebieden.
Indeling
De term 'indelingspas' beschrijft het proces van het meten en rangschikken van de leden van een Panel-afgeleide objectverzameling van kinderen en teken ze vervolgens op het scherm. De lay-outfase is een wiskundig intensief proces—hoe groter het aantal kinderen in de verzameling, des te groter het aantal vereiste berekeningen. Elke keer dat bijvoorbeeld een kind UIElement object in de verzameling zijn positie verandert, heeft het de potentie om een nieuw proces in het indelingssysteem te activeren. Vanwege de nauwe relatie tussen objectkenmerken en lay-outgedrag is het belangrijk om inzicht te hebben in het type gebeurtenissen dat het indelingssysteem kan aanroepen. Uw toepassing presteert beter door zo veel mogelijk onnodige aanroepen van het layoutproces te verminderen.
Het indelingssysteem voltooit twee doorgangen voor elk kindlid in een collectie: een meetdoorgang en een schikkingsdoorgang. Elk kinderobject heeft een eigen overschreven implementatie van de Measure- en Arrange-methoden om zijn eigen specifieke lay-outgedrag te realiseren. Op zijn eenvoudigst is opmaak een recursief systeem waardoor een element wordt gegroepeerd, gepositioneerd en getekend op het scherm.
Een onderliggend UIElement object begint het indelingsproces door eerst de kerneigenschappen te laten meten.
De FrameworkElement eigenschappen van het object die zijn gerelateerd aan de grootte, zoals Width, Heighten Margin, worden geëvalueerd.
Panel-specifieke logica wordt toegepast, zoals de eigenschap Dock van de DockPanelof de eigenschap Orientation van de StackPanel.
Inhoud wordt gerangschikt of gepositioneerd nadat alle kindobjecten zijn gemeten.
De verzameling kindobjecten wordt op het scherm getekend.
Het indelingspasproces wordt opnieuw aangeroepen als een van de volgende acties plaatsvindt:
Er wordt een kindobject toegevoegd aan de verzameling.
Er wordt een LayoutTransform toegepast op het kindobject.
De methode UpdateLayout wordt aangeroepen voor het kindobject.
Wanneer er een wijziging optreedt in de waarde van een afhankelijkheidseigenschap die is gemarkeerd met metagegevens, waardoor het meten of rangschikken wordt beïnvloed.
Gebruik waar mogelijk het meest efficiënte paneel
De complexiteit van het indelingsproces is rechtstreeks gebaseerd op het lay-outgedrag van de Panel-afgeleide elementen die u gebruikt. Een Grid of StackPanel besturingselement biedt bijvoorbeeld veel meer functionaliteit dan een Canvas besturingselement. De prijs voor deze grotere toename van functionaliteit is een grotere toename van de prestatiekosten. Als u echter niet de functionaliteit nodig hebt die een Grid besturingselement biedt, moet u de goedkopere alternatieven gebruiken, zoals een Canvas of een aangepast paneel.
Zie Panels Overviewvoor meer informatie.
Bijwerken in plaats van een RenderTransform vervangen
Mogelijk kunt u een Transform bijwerken in plaats van deze te vervangen als waarde van een RenderTransform-eigenschap. Dit geldt met name in scenario's waarin animatie is betrokken. Door een bestaande Transformbij te werken, voorkomt u dat u een onnodige indelingsberekening start.
Bouw uw boom Top-Down
Wanneer een knooppunt wordt toegevoegd aan of verwijderd uit de logische structuur, worden eigenschapsongeldigheden gegenereerd op het bovenliggende knooppunt en alle onderliggende knooppunten. Als gevolg hiervan moet altijd een top-down constructiepatroon worden gevolgd om de kosten te voorkomen van onnodige invalidaties op knooppunten die al zijn gevalideerd. In de volgende tabel ziet u het verschil in uitvoeringssnelheid tussen het bouwen van de boom van boven naar beneden versus van onder naar boven, waarbij de boom 150 niveaus diep is met één TextBlock en DockPanel op elk niveau.
| Actie | boomopbouw (in ms) | Render— inclusief boomstructuur bouwen (in ms) |
|---|---|---|
| Onderbeneden | 366 | 454 |
| Van boven naar beneden | 11 | 96 |
Het volgende codevoorbeeld laat zien hoe je een boom van boven naar beneden maakt.
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
Zie Trees in WPFvoor meer informatie over de logische structuur.
Zie ook
.NET Desktop feedback