Optimieren der Leistung: Anwendungsressourcen

Mit WPF können Sie Anwendungsressourcen freigeben, um ein einheitliches Aussehen oder Verhalten bei ähnlichen Elementen zu erzielen. In diesem Thema finden Sie 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.

Gemeinsame Nutzung 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.

Betrachten Sie Folgendes, um diesen Aspekt zu veranschaulichen. Angenommen, Sie entwickeln ein Kartenspiel mit WPF. Für die meisten Kartenspiele benötigen Sie 52 Karten mit 52 verschiedenen Bildern. 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 generiert 52 Instanzen von Brush-Objekten, sodass Sie insgesamt 52 × 52 Brush-Objekte in Ihrer Anwendung erhalten. 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.

Im folgenden Markupbeispiel wird dieser Punkt veranschaulicht:

<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>

Verwenden von statischen Ressourcen, wenn möglich

Eine statische Ressource stellt einen Wert für jedes XAML-Eigenschaftsattribut bereit, indem sie einen Verweis auf eine bereits definierte Ressource sucht. Das Lookupverhalten für diese Ressource ist analog zu einem Lookup zur Laufzeit.

Eine dynamische Ressource erstellt hingegen während der anfänglichen Kompilierung einen temporären Ausdruck und verzögert somit Lookupvorgänge für 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, wann immer dies möglich ist, in Ihrer Anwendung statische Ressourcen und nur bei Bedarf dynamische Ressourcen.

Das folgende Markupbeispiel zeigt die Verwendung dieser beiden 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