Optimera prestanda: Programresurser
MED WPF kan du dela programresurser så att du kan ha stöd för ett konsekvent utseende eller beteende för liknande element. Det här avsnittet innehåller några rekommendationer på det här området som kan hjälpa dig att förbättra programmets prestanda.
Mer information om resurser finns i XAML-resurser.
Dela resurser
Om ditt program använder anpassade kontroller och definierar resurser i en ResourceDictionary (eller XAML-resursnod) rekommenderar vi att du antingen definierar resurserna på Application- eller Window objektnivå eller definierar dem i standardtemat för de anpassade kontrollerna. Att definiera resurser i en anpassad kontrolls ResourceDictionary medför en prestandapåverkan för varje instans av den kontrollen. Om du till exempel har prestandaintensiva penselåtgärder som definierats som en del av resursdefinitionen för en anpassad kontroll och många instanser av den anpassade kontrollen ökar programmets arbetsuppsättning avsevärt.
Tänk på följande för att illustrera den här punkten. Anta att du utvecklar ett kortspel med WPF. För de flesta kortspel behöver du 52 kort med 52 olika ansikten. Du bestämmer dig för att implementera en anpassad kortkontroll och du definierar 52 penslar (var och en representerar ett kort ansikte) i resurserna för din anpassade kortkontroll. I huvudprogrammet skapar du först 52 instanser av den här kortets anpassade kontroll. Varje instans av kortets anpassade kontroll genererar 52 instanser av Brush objekt, vilket ger dig totalt 52 * 52 Brush objekt i ditt program. Genom att flytta penslar från kortets anpassade kontrollresurser till Application eller Window objektnivå, eller definiera dem i standardtemat för den anpassade kontrollen, minskar du programmets arbetsuppsättning eftersom du nu delar de 52 penslar mellan 52 instanser av kortkontrollen.
Dela en pensel utan att kopiera
Om du har flera element som använder samma Brush-objekt, definiera penseln som en resurs och referera till den istället för att definiera penseln inuti XAML. Den här metoden skapar en instans och återanvänder den, medan definitionen av penslar infogade i XAML skapar en ny instans för varje element.
Följande markeringsexempel illustrerar den här punkten:
<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>
Använd statiska resurser när det är möjligt
En statisk resurs ger ett värde för alla XAML-egenskapsattribut genom att leta upp en referens till en redan definierad resurs. Uppslagsbeteendet för den resursen är detsamma som kompileringstidsökning.
En dynamisk resurs å andra sidan skapar ett tillfälligt uttryck under den första kompileringen och skjuter därför upp sökning efter resurser tills det begärda resursvärdet faktiskt krävs för att skapa ett objekt. Uppslagsbeteendet för den resursen är likt sökning vid körning, vilket medför en påverkan på prestanda. Använd statiska resurser när det är möjligt i ditt program och använd endast dynamiska resurser när det behövs.
Följande markeringsprov visar användningen av båda typer av resurser.
<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>
Se även
.NET Desktop feedback