Optimieren der Leistung: Anwendungsressourcen
Mit WPF können Sie Anwendungsressourcen freigeben, damit Sie ein einheitliches Aussehen oder Verhalten für ähnliche Elemente unterstützen können. Dieses Thema enthält einige Empfehlungen in diesem Bereich, die Ihnen helfen können, die Leistung Ihrer Anwendungen zu verbessern.
Weitere Informationen zu Ressourcen finden Sie unter XAML-Ressourcen.
Freigeben von Ressourcen
Wenn Ihre Anwendung benutzerdefinierte Steuerelemente verwendet und Ressourcen in einem ResourceDictionary (oder XAML-Ressourcenknoten) definiert, empfiehlt es sich, die Ressourcen auf der Ebene des Application-Objekts oder Window-Objekts oder im Standarddesign für die benutzerdefinierten Steuerelemente zu definieren. Das Definieren von Ressourcen im ResourceDictionary eines benutzerdefinierten Steuerelements hat Auswirkungen auf die Leistung jeder Instanz dieses Steuerelements. Wenn Sie beispielsweise leistungsintensive Pinselvorgänge als Teil der Ressourcendefinition eines benutzerdefinierten Steuerelements und vieler Instanzen des benutzerdefinierten Steuerelements definiert haben, steigert dies den Arbeitssatz der Anwendung erheblich.
Beachten Sie folgendes, um diesen Punkt zu veranschaulichen. Angenommen, Sie entwickeln ein Kartenspiel mit WPF. Für die meisten Kartenspiele benötigen Sie 52 Karten mit 52 verschiedenen Gesichtern. Sie entscheiden sich für die Implementierung eines benutzerdefinierten Kartensteuerelements und definieren 52 Pinsel (jeweils ein Kartenbild) in den Ressourcen Ihres benutzerdefinierten Kartensteuerelements. In Ihrer Hauptanwendung erstellen Sie zunächst 52 Instanzen dieses benutzerdefinierten Kartensteuerelements. Jede Instanz des benutzerdefinierten Kartensteuerelements erzeugt 52 Instanzen von Brush-Objekten, wodurch insgesamt 52 * 52 Brush-Objekte in Ihrer Anwendung entstehen. Indem Sie die Pinsel aus den Ressourcen des benutzerdefinierten Kartensteuerelements auf die Ebene des Application-Objekts oder Window-Objekts verschieben oder im Standarddesign für das benutzerdefinierte Steuerelement definieren, reduzieren Sie den Arbeitssatz der Anwendung, da Sie damit die 52 Pinsel für die 52 Instanzen des Kartensteuerelements gemeinsam nutzen können.
Freigeben eines Pinsels ohne Kopieren
Wenn Sie mehrere Elemente mit demselben Brush-Objekt verwenden, definieren Sie den Pinsel als Ressource und verweisen darauf, anstatt den Pinsel in XAML zu definieren. Bei dieser Methode wird eine Instanz erstellt und wiederverwendet, während beim Definieren von Pinseln in XAML jeweils eine neue Instanz für jedes Element erstellt wird.
Das folgende Markupbeispiel veranschaulicht diesen Punkt:
<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>
Wann immer möglich, statische Ressourcen verwenden
Eine statische Ressource stellt einen Wert für jedes XAML-Eigenschaftsattribut bereit, indem ein Verweis auf eine bereits definierte Ressource gesucht wird. Das Lookupverhalten für diese Ressource ist analog zu einem Lookup zur Laufzeit.
Eine dynamische Ressource erstellt dagegen während der ersten Kompilierung einen temporären Ausdruck und verzögert somit die Suche nach Ressourcen, bis der angeforderte Ressourcenwert tatsächlich erforderlich ist, um ein Objekt zu erstellen. Das Lookupverhalten für diese Ressource ist analog zum Lookupvorgang zur Laufzeit, der jedoch Auswirkungen auf die Leistung hat. Verwenden Sie statische Ressourcen, wenn möglich in Ihrer Anwendung, nur bei Bedarf dynamische Ressourcen.
Das folgende Markupbeispiel zeigt die Verwendung beider Ressourcentypen:
<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>
Weitere Informationen
.NET Desktop feedback