从代码背后改变样式

Ala*_*392 5 wpf xaml

我有这种风格

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

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

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

        <Trigger Property="IsMouseOver"  Value="False">
            <Setter Property= "Foreground" Value="Black" />
            <Setter Property= "FontSize" Value="14"/>
            <Setter Property= "FontFamily" Value="Verdana"/>
        </Trigger>

    </Style.Triggers>

</Style>
Run Code Online (Sandbox Code Playgroud)

现在,如果我想从代码中更改Setter属性值,我该怎么办呢?

在代码背后,我想要这样的东西:

MainMenuStyle.IsMouseOver(True).Foreground = "Red"
MainMenuStyle.IsMouseOver(True).FontSize = 10

MainMenuStyle.IsMouseOver(False).Foreground = "Green"
MainMenuStyle.IsMouseOver(False).FontSize = 100
Run Code Online (Sandbox Code Playgroud)

我必须只使用框架4.

谢谢

Mik*_*son 4

Giangregorio 已经涵盖了无法直接实现这一点的大部分原因。不过,这里有一个解决方案:

您可以DynamicResource在样式中使用引用Setters,然后当您需要更改样式时,只需更新资源即可,而不是样式。通过一个例子可能会更有意义:

<!-- Colour Resources -->
<SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
<SolidColorBrush x:Key="RedBrush" Color="Red"/>

<!-- TextBlock Style (References the colour resources) -->
<Style x:Key="MainMenuStyle" TargetType="{x:Type TextBlock}"> 

    <Style.Triggers>
        <Trigger Property="IsMouseOver"  Value="True">
            <Setter Property= "Foreground" Value="{DynamicResource BlueBrush}"/>
            ...
        </Trigger>
        <Trigger Property="IsMouseOver"  Value="False">
            <Setter Property= "Foreground" Value="{DynamicResource RedBrush}" />
            ...
        </Trigger>
    </Style.Triggers>

</Style>
Run Code Online (Sandbox Code Playgroud)

所以。由于Foreground属性引用 a DynamicResource,每当资源更改时,它都会更新Style. 您需要在代码中做的就是更改资源值。

App.Current.Resources["BlueBrush"] = new SolidColorBrush(Colors.Pink);
Run Code Online (Sandbox Code Playgroud)

其余的将由他们DynamicResource处理。

  • 我只是坐在那里以为我知道 wpf 支持的样式绑定内容。+1 (2认同)