C# Style.Triggers与ControlTemplate.Triggers

C# Style.Triggers与ControlTemplate.Triggers,c#,wpf,xaml,styles,controltemplate,C#,Wpf,Xaml,Styles,Controltemplate,我应该在什么时候选择Style.Triggers,什么时候选择ControlTemplate.Triggers?使用一个比另一个有什么好处吗 假设我有这些风格可以达到相同的效果: <Style TargetType="{x:Type Button}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Ty

我应该在什么时候选择
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>

...
...
...

通过windows 8中的按钮进行更新确实使用了ControlTemplate。IsMouseOver的触发器,因此在某些情况下可能需要完全覆盖
ControlTemplate
,以获得所需的功能。因此,在这种情况下,您需要使用ControlTemplate触发器而不是样式触发器

您可能并不总是需要覆盖默认的
ControlTemplate
。假设你有一个控件,当
IsMouseOver
为true时,你希望所有MyTextControl都有一个蓝色的
前景
,并将其他所有内容保留为默认值。您可以使用以下内容:


如果您想使用
ControlTemplate.Triggers
,则需要复制默认的
MyTextControl
模板
,否则您将无法看到


除此之外,我认为唯一的区别是
Style.Triggers
的优先级低于
ControlTemplate.Triggers
()。但只有在使用这两种触发器类型时,这才有意义

对我来说,这不会覆盖默认模板style@CoolBlue对,这里的代码将保留默认模板不变。如果您使用问题中的代码,您将覆盖默认值。是的,我的观点是,由于优先级以及自Windows 8以来的更改,上述代码不再有效,这是因为样式未覆盖模板。现在最好的选择是在控件中单击鼠标右键,然后按照选项编辑默认样式的副本。VS2013提供了这个开箱即用的功能。@CoolBlue哦,我现在明白了。这在Windows 8中根本不起作用,还是只是应用商店?我只能找到类似或的信息。很遗憾,我没有一台机器来测试这个。我在windows 10桌面上,无法工作。看见