Wenn man dem Anwender in einer WPF Applikation weitere Themes bieten möchte stösst man mitunter auf verschiedene Probleme, wie es mir zB. erging.

Ich wollte innerhalb meiner Resourcedatei „Style.xaml“ verschiedene Elemente mit den selben Farbwerten versehen. Gesagt getan,

Eine „Variable“ festgelegt mit:

<SolidColorBrush x:Key="ThemeColor" Color="#95BBF0"/>

und gebunden:

1
2
3
4
5
6
<Style  TargetType="Button">
<Setter Property="Foreground" Value="{DynamicResource ThemeColor}"/>
<Setter Property="FontSize" Value="14"/>
...
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>

usw…  So weit so gut. Nun aber kam ein Element dazu, welches einen RadialGradientBrush beinhaltet und der RadialGradientBrush ist nicht gleich SolidColorBrush.

Zu folgender Fehlermeldung kommt es dabei:

Der Wert im Attribut „Color“ kann nicht in ein Objekt vom Typ „System.Windows.Media.Color“ konvertiert werden. „#FF95BBF0“ ist kein gültiger Wert für die Eigenschaft „Color“.

Nun, wie aber kann man im XAMl casten? Ich weiss es nicht. Mit einem Trick konnte dieses Problem aber dennoch gelöst werden. Dazu wurde einfach ein ColorElement angelegt:

<Color x:Key="ThemeColor">#95BBF0</Color>

und dieses dann dem SolidBrush zugewiesen:

<SolidColorBrush x:Key="ThemeColorSolid" Color="{DynamicResource ThemeColor}" />

das GradientElement, welches das RadialGradientBrush benötigt, dann an das ColorElement binden:

1
<GradientStop Color="{DynamicResource ThemeColor}" Offset="1" />

und die anderen Elemente  an das SolidBrushElement

1
<Setter Property="Background" Value="{DynamicResource ThemeColorSolid}"/>

Voila, nun hat man eine einmalige „Variable“ und beide Brushes sind damit abddeckt.

Du hast einen einfacheren Lösungsweg? Immer her damit!


Themes in WPF – SolidColorBrush und RadialGradientBrush
Markiert in: