web-dev-qa-db-ja.com

Style.TriggersとControlTemplate.Triggers

いつ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>
20
DeMama

Updatefrom 背景はボタンC#WPFを変更しません Windows 8のボタンはIsMouseOverのControlTemplate.Triggerを使用するため、目的の機能を取得するには、ControlTemplateを完全に上書きする必要がある場合があります。したがって、StyleトリガーではなくControlTemplateトリガーを使用する必要がある場合です。

デフォルトのControlTemplateを常にオーバーライドする必要はありません。コントロールがあり、Foregroundがtrueの場合、すべてのMyTextControlに青色のIsMouseOverを設定し、それ以外はすべてデフォルトのままにしておきます。次のようなものを使用できます。

<Style TargetType="{x:Type MyTextControl}">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="Blue"/>
        </Trigger>
    </Style.Triggers>
</Style>

ControlTemplate.Triggersを使用したい場合は、デフォルトのMyTextControlTemplateをコピーする必要があります。そうしないと、ビジュアルが表示されなくなります。

それを除けば、唯一の違いは、Style.Triggersの優先順位がControlTemplate.Triggersよりも低いことだと思います( Precedence documantation )。ただし、両方のトリガータイプを使用する場合にのみ問題になります。

15
ShyKnee