Zum Hauptinhalt springen

Ressourcen

In WPF unterscheidet man zwischen den folgenden Ressourcen:

  • Binäre Ressourcen
  • Logische Ressourcen

Binäre Ressourcen

Binäre Ressourcen sind Dateien wie Bilder, Icons, Audiodateien oder andere Dateien, die in Ihrem Projekt verwendet werden. Sie können diese Ressourcen in einem speziellen Ordner im Projektordner ablegen und dann in XAML verwenden, um auf sie zu verweisen.

<Button.Content>
<Image Source="img/MyImage.jpg" />
</Button.Content>
Image image = new Image();
image.Source = new BitmapImage(new Uri("img/MyImage.jpg", UriLind.Relative));

Logische Ressourcen

Logische Ressourcen sind Werte oder Objekte, die in XAML definiert sind und über einen Schlüssel zugänglich sind. Sie können beispielsweise Farben, Stile, Schriftarten oder andere Werte sein, die in Ihrem XAML-Code wiederverwendet werden können.

Logische Ressourcen können für die ganze Anwendung in der App.xaml definiert werden.

<Application.Resources>
<SolidColorBrush Color="Green" x:Key="default-color"/>
</Application.Resources>

Oder für eine einzelnes Fenster in jeweiligen xaml-Datei.

<Window.Resources>
<SolidColorBrush Color="Red" x:Key="second-color"/>
<LinearGradientBrush x:Key="yellow-to-orange">
<GradientStop Color="Yellow" Offset="0"/>
<GradientStop Color="Orange" Offset="1"/>
</LinearGradientBrush>
</Window.Resources>

Auf die Ressourcen kann dann wie folgt zugegriffen werden.

<StackPanel>
<Button Background="{StaticResource ResourceKey=default-color}" Content="Click me" />
<Button Background="{StaticResource second-color}" Content="Click me"/>
<Button Background="{StaticResource yellow-to-orange}" Content="Click me"/>
</StackPanel>

Oder in C# über:

// Wenn global für App vergeben oder in xaml des Fensters, also z.B. in App.xaml
btn1.Background = (Brush)FindResource("default-color");
// Wenn im xaml des Fensters vergeben
btn2.Background = (Brush)this.Resources["second-color"];

StaticResource vs. DynamicResource

Logische Ressourcen teilen sich auf in statische Ressourcen (Static Resources) und dynamische Ressourcen (Dynamic Resources).

Statische Ressourcen werden zur Designzeit ausgewertet und ihr Wert bleibt während der Laufzeit konstant. Sie werden häufig verwendet, wenn der Wert einer Ressource zur Designzeit bekannt ist und sich während der Laufzeit nicht ändert. Statische Ressourcen bieten eine bessere Leistung, da sie nur einmal ausgewertet werden.

Beispiel statische Ressource:

<Window.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Red" />
</Window.Resources>

<Button Background="{StaticResource MyBrush}" Content="Click Me" />

Dynamische Ressourcen werden zur Laufzeit ausgewertet und ihr Wert kann sich während der Laufzeit ändern. Sie werden verwendet, wenn der Wert einer Ressource zur Laufzeit ermittelt oder geändert wird. Dynamische Ressourcen ermöglichen es, den Wert einer Ressource zur Laufzeit anzupassen und das visuelle Erscheinungsbild der Anwendung zu ändern.

Beispiel dynamische Ressource:

<Window.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Red" />
</Window.Resources>

<Button Background="{DynamicResource MyBrush}" Content="Click Me" />
myButton.SetResourceReference(Button.BackgroundProperty, "MyBrush");

Der Hauptunterschied besteht darin, dass bei statischen Ressourcen der Wert zur Designzeit festgelegt wird und zur Laufzeit unveränderlich bleibt, während bei dynamischen Ressourcen der Wert zur Laufzeit festgelegt oder geändert werden kann.

Es ist zu beachten, dass die Verwendung von dynamischen Ressourcen einen geringen Leistungseinfluss haben kann, da der Wert zur Laufzeit ausgewertet wird. Daher sollten dynamische Ressourcen sparsam eingesetzt werden, insbesondere wenn sich ihr Wert nicht häufig ändert.

Ressourcenwörterbücher

Ein Ressourcenwörterbuch in WPF ist eine Sammlung von Ressourcen, die in XAML definiert sind und von verschiedenen Teilen der Anwendung referenziert werden können. Es ermöglicht eine zentrale Verwaltung und Wiederverwendung von Ressourcen wie Stilen, Vorlagen, Brushes, DataTemplates und mehr.

Ein Ressourcenwörterbuch kann in XAML oder im Code-Behind einer WPF-Anwendung definiert werden. Hier ist ein Beispiel für ein Ressourcenwörterbuch in XAML:

<Window.Resources>
<ResourceDictionary>
<SolidColorBrush x:Key="MyBrush" Color="Red" />
<Style x:Key="MyButtonStyle" TargetType="Button">
<Setter Property="Background" Value="{StaticResource MyBrush}" />
<Setter Property="Foreground" Value="White" />
</Style>
</ResourceDictionary>
</Window.Resources>

In diesem Beispiel wird ein Ressourcenwörterbuch definiert, das zwei Ressourcen enthält: eine SolidColorBrush mit dem Key "MyBrush" und einen Button-Stil mit dem Key "MyButtonStyle". Die Ressourcen können dann in verschiedenen Elementen der Anwendung referenziert werden, indem der entsprechende Key verwendet wird.

Beispiel für die Verwendung der Ressourcen im XAML:

<Button Style="{StaticResource MyButtonStyle}" Content="Click Me" />
<TextBlock Foreground="{StaticResource MyBrush}" Text="Hello World!" />

In diesem Beispiel wird der Button-Stil "MyButtonStyle" auf einen Button angewendet, und die SolidColorBrush "MyBrush" wird als Vordergrundfarbe für den TextBlock verwendet. Durch die Verwendung der StaticResource Markup Extension wird auf die entsprechenden Ressourcen im Ressourcenwörterbuch verwiesen.

Zugriff auf Systemressourcen

In WPF besteht die Möglichkeit, auf Systemressourcen wie Systemfarben, Systemfonts und andere Systemeinstellungen zuzugreifen. Dies kann durch Verwendung der statischen Eigenschaften der SystemColors, SystemFonts und SystemParameters Klassen erfolgen.

Hier ist ein Beispiel, wie Sie auf einige Systemressourcen zugreifen können:

<TextBlock Foreground="{x:Static SystemColors.WindowTextBrush}" Text="Hello World!" />
<Button FontSize="{x:Static SystemFonts.CaptionFontSize}" Content="Click Me" />
<Border BorderBrush="{x:Static SystemColors.ControlDarkBrush}" BorderThickness="1" />

In diesem Beispiel wird die Vordergrundfarbe des TextBlocks auf die Systemfarbe SystemColors.WindowTextBrush gesetzt, die Schriftgröße des Buttons auf SystemFonts.CaptionFontSize und die Rahmenfarbe des Borders auf SystemColors.ControlDarkBrush. Durch die Verwendung der x:Static Markup-Erweiterung wird auf die entsprechenden statischen Eigenschaften der Systemressourcenklassen verwiesen.

Es ist wichtig zu beachten, dass Änderungen an den Systemeinstellungen erst nach einem Neustart der Anwendung wirksam werden. Daher sollten Systemressourcen mit Bedacht verwendet werden und sicherstellen, dass die Anwendung auch mit verschiedenen Systemeinstellungen ordnungsgemäß funktioniert.


Kommentare