Style.Triggers与ControlTemplate.Triggers

DeM*_*ama 18 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>
Run Code Online (Sandbox Code Playgroud)

小智 15

Background 更新不会更改按钮C#WPF Windows 8中的Button确实对IsMouseOver使用ControlTemplate.Trigger,因此有些情况ControlTemplate可能需要完全覆盖才能获得所需的功能.因此,您需要在Style触发器上使用ControlTemplate触发器.

您可能并不总是需要覆盖默认值ControlTemplate.假设您有一个控件,并且您希望所有MyTextControl ForegroundIsMouseOver为true 时为蓝色,并将其他所有内容保留为默认值.你可以使用这样的东西:

<Style TargetType="{x:Type MyTextControl}">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="Blue"/>
        </Trigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

如果你想使用ControlTemplate.Triggers你需要复制默认值MyTextControl Template,否则你最终会没有视觉效果.

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