2014-11-05 6 views
9

Wann sollte ich Style.Triggers wählen und wann sollte ich ControlTemplate.Triggers wählen? Gibt es irgendwelche Vorteile, die übereinander liegen?Style.Triggers vs ControlTemplate.Triggers

sagen, dass ich diese Stile haben, die das gleiche Ergebnis erzielen:

<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> 

Antwort

10

aktualisieren von Background does not change of button C# WPF auf den Button in Windows 8 nicht verwendet eine ControlTemplate.Trigger für IsMouseOver so Fälle gibt es, wo ControlTemplate müssen sein vollständig überschrieben, um die gewünschte Funktionalität zu erhalten. Das wäre also ein Fall, in dem Sie ControlTemplate-Trigger über Style-Trigger verwenden müssen.

Sie können nicht immer den Standard ControlTemplate außer Kraft setzen müssen. Sagen Sie bitte eine Kontrolle haben, und Sie wollen alle MyTextControl a a Foreground blau haben, wenn IsMouseOver wahr ist und alles andere als Standard verlassen. Man könnte so etwas wie folgt verwenden:

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

Wenn Sie die ControlTemplate.Triggers müssten Sie kopieren die Standard MyTextControlTemplate oder sonst würden Sie am Ende ohne visuelle nutzen wollte.

Abgesehen davon denke ich, der einzige Unterschied ist, dass Style.Triggers eine niedrigere Priorität als ControlTemplate.Triggers (Precedence documantation) hat. Aber das wäre nur wichtig, wenn Sie beide Trigger-Typen verwenden.

+0

Für mich ist dies überschreibt nicht die Standardvorlage Stil –

+0

@CoolBlue Rechts, der Code hier wird die Standardvorlage intakt lassen. Wenn Sie die Code von der Frage verwenden wären, würden Sie den Standard überschrieben sein. – ShyKnee

+0

Ja, mein Punkt ist, dass wegen der Priorität, zusammen mit Änderungen seit Windows 8, der obige Code nicht mehr funktioniert, und das ist, weil die Vorlage nicht vom Stil überschrieben wird. Die beste Option ist heutzutage, mit der rechten Maustaste in das Steuerelement zu klicken und den Optionen zu folgen, um eine Kopie des Standardstils zu bearbeiten. VS2013 bietet dies aus der Box. –