Style.Triggers与ControlTemplate.Triggers的区别

24

我应该在什么情况下选择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>
2个回答

19

更新来自C# WPF中按钮背景颜色不变问题。Windows 8中的按钮使用ControlTemplate.Trigger来处理IsMouseOver,所以有时需要完全重写 ControlTemplate 来获取所需的功能。 因此,这是需要使用ControlTemplate触发器而不是样式触发器的情况之一。

您不一定需要覆盖默认的ControlTemplate。比如说,如果您有一个控件,希望在IsMouseOver为true时,所有的MyTextControl都拥有蓝色前景色,并将其他所有内容保持默认状态,您可以使用类似以下代码:

<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 (优先级文档)。但这只有在使用两种触发器类型时才有影响。


对我来说,这不会覆盖默认的模板样式。 - Cool Blue
@CoolBlue 对的,这里的代码将保留默认模板不变。如果你使用问题中的<Setter Property="Template">代码,你将会覆盖默认设置。 - ShyKnee
我的观点是,由于优先级以及自Windows 8以来的更改,上述代码不再起作用,并且这是因为模板没有被样式覆盖。如今最好的方法是在控件中右键单击并选择编辑默认样式的副本。VS2013默认提供了此功能。 - Cool Blue
@CoolBlue 哦,我明白了。这在Windows 8上完全不起作用还是只是商店应用程序?我只能找到像这个这个这样的信息。不幸的是我没有机器来测试。 - ShyKnee
1
我在Windows 10桌面上工作时出现问题。请参考此答案 - Cool Blue
@CoolBlue 感谢提供链接。我猜我的优先级也是反过来了。 - ShyKnee

0

这取决于您想要改变控件的视觉效果有多少。如果您只想更改控件的某些方面,可以使用样式(style)。如果您想完全改变控件的外观,则需要使用控件模板(controltemplate)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接