Idealerweise werden Styles in eigenen Ressourcendateien abgelegt. Jedoch kann es notwendig sein, einen Style zur Laufzeit zu verändert oder gar zu erweitern. Dieser Beitrag zeigt, wie dies möglich ist.
Gegeben sei der nachfolgende Style für ein Border-Element:
<Style TargetType="Border" x:Key="MyBorderStyle">
<Setter Property="Height" Value="16"/>
<Setter Property="MaxHeight" Value="16"/>
<Setter Property="BorderThickness" Value="1"/>
</Style>
Gehen wir nun davon aus, dass der Style für den Border zusätzlich die Eigenschaft Background bedienen soll (beispielsweise weil der Hintergrund durch die Anwendung berechnet wird).
Hierzu wird im ersten Schritt der eigentliche Style bezogen und ein Brush-Objekt erzeugt. Nun erzeugen wir ein neues Style-Objekt, welches als TargetType den Typ Border gesetzt bekommt und via BasedOn auf den über die Ressourcen bezogenen Style zeigt. D.h. von diesem ableitet und ihn somit erweitert.
Über die Auflistung Setters kann auf die einzelnen Setter des Styles zugegriffen werden. Via Add können Objekte vom Basistyp SetterBase hinzugefügt werden. Als konkrete Implementierung verwenden wir hier Setter. Die Eigenschaft Property verweist auf eine DependencyProperty und Value stellt den zu setzenden Wert dar.
Schlussendlich muss der neu erstellte Style nur mehr zugewiesen werden. Nachfolgend der Code dazu.
Style myStyle = (Style)Application.Current.Resources["MyBorderStyle"];
SolidColorBrush backgroundBrush = new SolidColorBrush(Colors.Blue);
Style newStyle = new Style
{
TargetType = typeof(Border),
BasedOn = myStyle
};
newStyle.Setters.Add(
new Setter
{
Property = Border.BackgroundProperty,
Value = backgroundBrush
});
myBorder.Style = myStyle;