从代码中更改样式(在ResourceDictionary中)

时间:2015-12-04 16:37:16

标签: c# wpf xaml

我有这个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>

如果我想更改字体大小或颜色,我该怎么办?这段代码不起作用。

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

这是xaml

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

2 个答案:

答案 0 :(得分:0)

在您的代码中:

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

1)语法错误。 Application.Current.Resources["MainMenuLabelStyle"]

2)Application.Current.Resources["MainMenuLabelStyle"]此代码将返回类型为Style的对象,而不是样式属性Font Size

您可以创建新的Style并将其替换为ResourceDictionary。

答案 1 :(得分:0)

在WPF应用程序中第一次使用样式之前,由于性能原因而将其密封,因此无法再对其进行修改。您可以在MSDN上阅读。

所以,如果你想改变你的风格,你必须选择。第一个(最简单的一个)是根据需要声明多个样式并将它们放在ResourceDictionary中。

第二种解决方案是考虑SetterDependencyObject,因此您可以绑定其依赖项属性。在这种情况下,您的风格将变为:

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

现在,您只需设置每个Tag控件的TextBlock属性即可更改样式:

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

正如您所看到的,第一个TextBlock将使用声明的样式。另一方面,第二个TextBlock将使用原始样式的修改版本。

当然,为了使此选项正常工作,您必须在我的示例中创建一个类(StyleConfig),这可能是这样的:

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

我希望它可以帮到你。