Alan392
Alan392

Reputation: 685

Change style (in ResourceDictionary) from code

I have this ResourceDictionary

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Style x:Key="MainMenuLabelStyle" TargetType="{x:Type TextBlock}">

    <Style.Triggers>
        <Trigger Property ="IsMouseOver" Value="True">
            <Setter Property= "Foreground" Value="White"/>
            <Setter Property= "FontSize" Value="18"/>
            <Setter Property= "FontFamily" Value="Arial"/>
        </Trigger>
    </Style.Triggers>

</Style>

If I want change the font size or color, what can I do ? This code doesn't work .

 Application.Current.Resources("MainMenuLabelStyle") = 25

This is the xaml

  <TextBlock Text="Uscita" Grid.Row="1" Grid.Column="1"  TextAlignment="Left"  Margin="4" TextWrapping="Wrap" Style="{DynamicResource MainMenuLabelStyle}">

Upvotes: 2

Views: 1124

Answers (2)

Il Vic
Il Vic

Reputation: 5666

Just before a style is used for the first time in a WPF application, it is sealed for performance reasons and it is not possible to modify it anymore. You can read it on MSDN.

So, if you want to change your style, you have to options. The first one (the easiest one) is to declare as many styles as you need and put them in your ResourceDictionary.

The second solution is to consider that a Setter is a DependencyObject, so you can bind its dependency properties. In this case your style will become:

<Style x:Key="MainMenuLabelStyle" TargetType="{x:Type TextBlock}">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag.Foreground, TargetNullValue=Red, FallbackValue=Red}" />
            <Setter Property="FontSize" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag.FontSize, TargetNullValue=18, FallbackValue=18}" />
            <Setter Property="FontFamily" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag.FontFamily, TargetNullValue=Arial, FallbackValue=Arial}" />
        </Trigger>
    </Style.Triggers>
</Style>

Now you can change the style just by setting the Tag property of every TextBlock control:

<StackPanel>
    <TextBlock Text="Uscita" TextAlignment="Left" Margin="4" TextWrapping="Wrap" Style="{DynamicResource MainMenuLabelStyle}" />
    <TextBlock Text="Uscita" TextAlignment="Left"  Margin="4" TextWrapping="Wrap" Style="{DynamicResource MainMenuLabelStyle}">
        <TextBlock.Tag>
            <local:StyleConfig FontSize="50" FontFamily="Tahoma" Foreground="Orange" />
        </TextBlock.Tag>
    </TextBlock>
</StackPanel>

As you can see the first TextBlock will use the style as it was declared. On the other side, the second TextBlock will use a modified version of the original style.

Of course, in order to make this option work correctly, you must create a class (StyleConfig in my sample), which could be something like this:

public class StyleConfig
{
    public string Foreground { get; set; }
    public string FontSize { get; set; }
    public string FontFamily { get; set; }
}

I hope it can help you.

Upvotes: 1

f14shm4n
f14shm4n

Reputation: 461

In your code:

Application.Current.Resources("MainMenuLabelStyle") = 25

1) Wrong syntax. Application.Current.Resources["MainMenuLabelStyle"]

2) Application.Current.Resources["MainMenuLabelStyle"] this code will return object with type Style, not style property Font Size.

You can create new Style and replace it in ResourceDictionary.

Upvotes: 0

Related Questions