Style.Triggers与ControlTemplate.Triggers

时间:2014-11-05 23:45:35

标签: c# wpf xaml styles controltemplate

我应该何时选择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>

1 个答案:

答案 0 :(得分:15)

来自Background does not change of button C# WPF

更新 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.TriggersPrecedence documantation)。但是,只有使用两种触发类型才有意义。