Prestaties optimaliseren: Toepassingsbronnen
Met WPF kunt u toepassingsresources delen, zodat u een consistent uiterlijk of gedrag kunt ondersteunen voor vergelijkbare elementen. In dit onderwerp vindt u enkele aanbevelingen op dit gebied waarmee u de prestaties van uw toepassingen kunt verbeteren.
Zie XAML-resourcesvoor meer informatie over resources.
Hulpmiddelen delen
Als uw toepassing aangepaste besturingselementen gebruikt en resources definieert in een ResourceDictionary (of het knooppunt XAML-resources), kunt u het beste de resources definiëren op het niveau van de Application of Window object, of deze definiëren in het standaardthema voor de aangepaste besturingselementen. Het definiëren van resources in de ResourceDictionary van een aangepast besturingselement brengt een prestatie-impact met zich mee voor elke instantie van dat besturingselement. Als u bijvoorbeeld prestatie-intensieve borstelbewerkingen hebt gedefinieerd als onderdeel van de resourcedefinitie van een aangepast besturingselement en veel exemplaren van het aangepaste besturingselement, neemt de werkset van de toepassing aanzienlijk toe.
Bekijk het volgende om dit punt te illustreren. Stel dat u een kaartspel ontwikkelt met WPF. Voor de meeste kaartspellen hebt u 52 kaarten met 52 verschillende gezichten nodig. U besluit een aangepast kaartbeheer te implementeren en u definieert 52 borstels (elk die een kaartgezicht vertegenwoordigen) in de resources van uw aangepaste kaartbeheer. In de hoofdtoepassing maakt u in eerste instantie 52 exemplaren van dit aangepaste besturingselement voor kaarten. Elk exemplaar van het aangepaste besturingselement voor kaarten genereert 52 exemplaren van Brush objecten, waardoor u in totaal 52 * 52 Brush objecten in uw toepassing krijgt. Door de penselen uit de aangepaste controleresources van de kaart te verplaatsen naar het Application of Window objectniveau, of door ze te definiëren in het standaardthema voor het aangepaste besturingselement, vermindert u de werkset van de toepassing, omdat u nu de 52 borstels deelt tussen 52 exemplaren van het kaartbesturingselement.
Een penseel delen zonder te dupliceren
Als u meerdere elementen met hetzelfde Brush-object gebruikt, definieert u de kwast als een resource en verwijst ernaar, in plaats van de kwast inline in XAML te definiëren. Met deze methode wordt één exemplaar gemaakt en opnieuw gebruikt, terwijl het definiëren van penselen inline in XAML een nieuw exemplaar voor elk element maakt.
Het volgende voorbeeld van markeringen illustreert dit punt:
<StackPanel.Resources>
<LinearGradientBrush x:Key="myBrush" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="GoldenRod" Offset="0" />
<GradientStop Color="White" Offset="1" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</StackPanel.Resources>
<!-- Non-shared Brush object. -->
<Label>
Label 1
<Label.Background>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="GoldenRod" Offset="0" />
<GradientStop Color="White" Offset="1" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Label.Background>
</Label>
<!-- Shared Brush object. -->
<Label Background="{StaticResource myBrush}">Label 2</Label>
<Label Background="{StaticResource myBrush}">Label 3</Label>
Statische resources gebruiken indien mogelijk
Een statische resource biedt een waarde voor een XAML-eigenschapskenmerk door een verwijzing naar een al gedefinieerde resource op te zoeken. Het opzoekgedrag voor die resource is analoog aan opzoeken tijdens de compilatietijd.
Een dynamische resource maakt daarentegen een tijdelijke expressie tijdens de eerste compilatie en stelt dus de zoekactie voor resources uit totdat de aangevraagde resourcewaarde daadwerkelijk is vereist om een object te maken. Opzoekgedrag voor die resource is vergelijkbaar met runtimezoekacties, wat een prestatie-impact oplegt. Gebruik waar mogelijk statische resources in uw toepassing, waarbij u alleen dynamische resources gebruikt wanneer dat nodig is.
In het volgende voorbeeld van markeringen ziet u het gebruik van beide typen resources:
<StackPanel.Resources>
<SolidColorBrush x:Key="myBrush" Color="Teal"/>
</StackPanel.Resources>
<!-- StaticResource reference -->
<Label Foreground="{StaticResource myBrush}">Label 1</Label>
<!-- DynamicResource reference -->
<Label Foreground="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">Label 2</Label>
Zie ook
.NET Desktop feedback