In uno stile si impostano le proprietà di un controllo.
<Style x:Key="MyButtonStyle" TargetType="Button">
<Setter Property="Background" Value="Red"/>
</Style>
<Button Style="{StaticResource MyButtonStyle}"/>
Tutti i pulsanti che utilizzano questo stile avranno i loro sfondi impostati su Rosso.
In un modello viene definita l'interfaccia utente (struttura) del controllo.
<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
<Grid>
<Rectangle Fill="Green"/>
<ContentPresenter/>
</Grid>
</ControlTemplate>
<Button Template="{StaticResource MyButtonTemplate}"/>
Tutti i pulsanti che utilizzano questo modello avranno uno sfondo verde che non può essere modificato.
I valori impostati in un modello possono essere sostituiti solo sostituendo l'intero modello. I valori in uno stile possono essere sostituiti impostando il valore in modo esplicito quando si utilizza il controllo. Ecco perché è meglio utilizzare le proprietà del controllo utilizzando TemplateBinding anziché i valori di codifica.
<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
<Grid>
<Rectangle Fill="{TemplateBinding Background}"/>
<ContentPresenter/>
</Grid>
</ControlTemplate>
Ora il modello utilizza il valore della proprietà di sfondo del pulsante è applicato a, in modo che può essere personalizzato:
<Button Template="{StaticResource MyButtonTemplate}" Background="Yellow"/>
Un'altra caratteristica utile è che i controlli possono prendere uno stile predefinito senza avere uno stile specifico assegnato a loro. Non puoi farlo con un modello.
Basta rimuovere l'attributo x: Key dello stile (di nuovo: non è possibile farlo con i modelli). A tutti i pulsanti nella struttura ad albero sotto lo stile verrà applicato questo stile.
combinazione di modelli e stili è più potente: è possibile impostare la proprietà modello dell'universo:
<Style TargetType="Button">
<Setter Property="Background" Value="Red"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Rectangle Fill="{TemplateBinding Background"/>
<ContentPresenter/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Correlato: [ItemTemplate vs ControlTemplate] (http://stackoverflow.com/questions/575389/itemtemplate-vs-controltemplate) – Helen
risorsa MSDN, la differenza tra stili e modelli: http://msdn.microsoft.com/ it/us/library/cc295273% 28v = expression.40% 29.aspx –