2014-11-05 4 views
9

Quando dovrei scegliere Style.Triggers e quando dovrei scegliere ControlTemplate.Triggers? Ci sono dei vantaggi nell'usare l'uno rispetto all'altro?Style.Triggers vs ControlTemplate.Triggers

Dire che ho questi stili che ottengono lo stesso risultato:

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

risposta

10

Aggiornamento dal Background does not change of button C# WPF il pulsante in Windows 8 fa uso di un ControlTemplate.Trigger per IsMouseOver quindi non ci sono casi in cui ControlTemplate potrebbe essere necessario completamente sovrascritto per ottenere la funzionalità desiderata. Quindi sarebbe il caso in cui è necessario utilizzare i trigger ControlTemplate su trigger Style.

Potrebbe non essere necessario sovrascrivere il valore predefinito ControlTemplate. Supponiamo che tu abbia un controllo e che tutto il MyTextControl abbia un blu Foreground quando IsMouseOver è vero e lascia tutto il resto come predefinito. Si potrebbe usare qualcosa di simile:

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

Se si volesse utilizzare il ControlTemplate.Triggers si avrebbe bisogno di copiare il default MyTextControlTemplate altrimenti si finirebbe senza visivo.

A parte questo, penso che l'unica differenza è che Style.Triggers ha una precedenza inferiore a ControlTemplate.Triggers (Precedence documantation). Ma ciò conta solo se si usano entrambi i tipi di trigger.

+0

Per me, questo non sovrascrive lo stile di modello predefinito –

+0

@CoolBlue A destra, il codice qui lascerà intatto il modello predefinito. Se dovessi utilizzare il codice dalla domanda, ignorerai il valore predefinito. – ShyKnee

+0

Sì, il mio punto è che, a causa della precedenza, insieme ai cambiamenti da Windows 8, il codice precedente non funziona più e questo è _because_ il modello non è sovrascritto dallo stile. La cosa migliore in questi giorni è fare clic con il tasto destro del mouse sul controllo e seguire le opzioni per modificare una copia dello stile predefinito. VS2013 fornisce questo fuori dalla scatola. –

Problemi correlati