在触发器中嵌入资源列表以应用条件主题

时间:2013-04-18 13:13:41

标签: wpf xaml

所以我第一次使用wpf应用程序并遇到了绊脚石。

我正在使用来自第三方(actipro)的主题,我可以将该主题中的各个属性设置为我想要的任何内容

<Style.Resources>
    <SolidColorBrush   x:Key="{x:Static themes:AssetResourceKeys.ExpanderHeaderBackgroundNormalBrushKey}" Color="Yellow" />
</Style.Resources>

实际上,我想要做的是将声明放在触发器中,如此

<Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
              <SolidColorBrush   x:Key="{x:Static themes:AssetResourceKeys.ExpanderHeaderBackgroundNormalBrushKey}" Color="Yellow" />
    </Trigger>
</Style.Triggers>

但这当然是非法语法。

我知道我可以像这样设置条件样式

<Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
                  <Setter Property="Background" Value="Yellow" />
        </Trigger>
</Style.Triggers>

甚至喜欢这个

<Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
                  <Setter Property="Background" Value="{StaticResource {x:Static themes:AssetResourceKeys.ExpanderHeaderBackgroundNormalBrushKey}}" />
        </Trigger>
</Style.Triggers>

但是这会将背景设置为资源定义的颜色。这不是我追求的目标 我需要设置ExpanderHeaderBackground,它不是setter的可用属性。

在我看来,能够在触发器中定义资源本身似乎是合乎逻辑的。然后他们只会在满足某些条件时才适用。显然,这不是wpf的工作原理。

任何人都知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

您可以在样式资源中设置资源,但不能在触发器本身中设置资源。

<Style TargetType="Control">
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static themes:AssetResourceKeys.ExpanderHeaderBackgroundNormalBrushKey}" Color="Yellow" />
    </Style.Resources>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="{StaticResource themes:AssetResourceKeys.ExpanderHeaderBackgroundNormalBrushKey}" />
        </Trigger>
    </Style.Triggers>
</Style>

触发器本身不提供特定资源。如果您想要实现的是基于其资源键覆盖特定资源,并且取决于UI行为(例如MouseOver),则必须使用后面的代码来执行此操作。

编辑:我不熟悉Actipro,但是他们是否建议通过基于资源键覆盖资源来自定义主题?它不被认为是一种非常好的做法,因为它不会产生可靠的结果。