我应该何时选择Style.Triggers
,何时应该选择ControlTemplate.Triggers
?使用一个在另一个上有什么好处吗?
说我有这些样式可以达到相同的效果:
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<ControlTemplate.Triggers>
...
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
...
</Setter>
<Style.Triggers>
...
</Style.Triggers>
</Style>
答案 0 :(得分:15)
更新 Windows 8中的Button确实对IsMouseOver使用了ControlTemplate.Trigger,因此有些情况下可能需要完全覆盖ControlTemplate
才能获得所需的内容功能。因此,您需要在Style触发器上使用ControlTemplate触发器。
您可能并不总是需要覆盖默认的ControlTemplate
。假设您有一个控件,并且您希望所有MyTextControl在Foreground
为真时具有蓝色IsMouseOver
并将其他所有内容保留为默认值。你可以使用这样的东西:
<Style TargetType="{x:Type MyTextControl}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Blue"/>
</Trigger>
</Style.Triggers>
</Style>
如果您想使用ControlTemplate.Triggers
,则需要复制默认的MyTextControl
Template
,否则您最终会看不到视觉效果。
除此之外,我认为唯一的区别是Style.Triggers
的优先级低于ControlTemplate.Triggers
(Precedence documantation)。但是,只有使用两种触发类型才有意义。