所以我第一次使用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的工作原理。
任何人都知道如何实现这个目标吗?
答案 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,但是他们是否建议通过基于资源键覆盖资源来自定义主题?它不被认为是一种非常好的做法,因为它不会产生可靠的结果。