0

所以我第一次使用 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 的工作方式。

有谁知道我怎么能做到这一点?

4

1 回答 1

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,但他们是否建议通过基于资源键覆盖资源来自定义主题?这不被认为是一种很好的做法,因为它不会产生可靠的结果。

于 2013-04-18T13:25:57.127 回答