2011-05-26 16 views
46

Potrebbe dirmi quali sono le principali differenze tra Style e ControlTemplate? Quando o perché usare l'uno o l'altro?Differenza tra stile e ControlTemplate

Ai miei occhi, sono esattamente la stessa stessa. Poiché sono principiante, penso di essermi sbagliato, quindi la mia domanda.

+1

Correlato: [ItemTemplate vs ControlTemplate] (http://stackoverflow.com/questions/575389/itemtemplate-vs-controltemplate) – Helen

+2

risorsa MSDN, la differenza tra stili e modelli: http://msdn.microsoft.com/ it/us/library/cc295273% 28v = expression.40% 29.aspx –

risposta

23

In effetti non ti sbagli. Gli stili impostano le proprietà sui controlli. ControlTemplate è una proprietà condivisa dalla maggior parte dei controlli che specificano in che modo vengono renderizzati.

Per elaborare, è possibile utilizzare uno stile per raggruppare le impostazioni per un gruppo di proprietà in modo da poterlo riutilizzare per standardizzare i controlli. Gli stili possono essere impostati esplicitamente sui controlli o applicati anche a un determinato tipo.

I modelli di controllo possono essere impostati da uno stile o impostati in modo esplicito su un controllo per modificare il modo in cui viene visualizzato. Tutti i controlli hanno modelli predefiniti (e stili per quella materia) incorporati negli assembly .net wpf. È abbastanza illuminante vederli e capire come gli sviluppatori di wpf hanno implementato le normali versioni di tutti i controlli. Se hai installato Expression blend, cerca nella sua cartella "SystemThemes".

UPDATE:

Per capire come stili e ControlTemplate possono "aggiungere controlli". In un modo o nell'altro, il ControlTemplate è l'unico modo per definire i controlli che un controllo è costituito da. Tuttavia, alcuni controlli .net predefiniti consentono di utilizzare i controlli al posto del testo.

Ad esempio:

<GroupBox> 
    <GroupBox.Header> 
    <CheckBox/> 
    </GroupBox.Header> 
</GroupBox> 

Questo "aggiunge" una casella di controllo al groupbox senza cambiare la ControlTemplate, ma questo è perché il default ControlTemplate per GroupBox permette nulla come l'intestazione. Questo viene fatto usando controlli speciali come ContentPresenter.

Tuttavia, a volte il ControlTemplate predefinito per un controllo non consente di modificare qualcosa che si desidera modificare tramite le proprietà. Quindi è necessario modificare il ControlTemplate.

Se si impostano le proprietà di un controllo (contenuto, intestazione, ControlTemplate, IsEnabled, ecc.) Direttamente o tramite uno stile non importa, gli stili sono solo una comodità.

Speriamo che questo risponda alla tua domanda in modo più chiaro.

+1

Ok, ma nel progetto per cui lavoro, entrambi sono stati usati per aggiungere altri controlli ad alcuni controlli ... e anche per impostare le proprietà ... quindi non vedo la differenza nel loro uso? ? ? –

53

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

Quindi il tuo esempio si adatta esattamente alla domanda che mi sto chiedendo ... qual è la differenza tra un modello di controllo e uno stile che definisce SOLO un elemento di controllo? È comune incapsulare sempre il controltemplate con Styles? –

13

si può pensare di uno stile come un modo conveniente per applicare un insieme di valori di proprietà a più di un elemento. È possibile modificare l'aspetto predefinito impostando le proprietà, ad esempio FontSize e FontFamily, direttamente su ciascun elemento TextBlock. Tuttavia, se desideri che gli elementi di TextBlock condividano alcune proprietà, puoi creare uno stile nella sezione Risorse del tuo file XAML.

D'altra parte, ControlTemplate specifica la struttura visiva e il comportamento visivo di un controllo. È possibile personalizzare l'aspetto di un controllo dandogli un nuovo ControlTemplate. Quando si crea un oggetto ControlTemplate, si sostituisce l'aspetto di un controllo esistente senza modificarne la funzionalità. Ad esempio, puoi rendere i pulsanti nella tua applicazione invece della forma quadrata predefinita, ma il pulsante aumenterà comunque l'evento Click.

Rif: http://msdn.microsoft.com/en-us/library/ms745683.aspx

0

OK, ho avuto la stessa identica domanda e le risposte che ho trovato in questa discussione mi ha segnalato nella giusta direzione, così sto condividendo, se solo così posso capire meglio me stesso.

Uno stile è più flessibile di un ControlTemplate.

Da Windows Presentation Foundation Unleashed, Adam Nathan e banda di stato (scrittori) questo:

  • "Oltre alla comodità di combinare un modello [con uno stile utilizzando ControlTemplate setter del Stile] con la proprietà arbitraria impostazioni, ci sono importanti vantaggi di fare questo [l'impostazione del setter ControlTemplate su uno stile]:.

    1. ti dà l'effetto di modelli predefiniti, ad esempio, quando uno stile digitato viene applicato a el Per impostazione predefinita, e che Style contiene un modello di controllo personalizzato, il modello di controllo viene applicato senza alcun riferimento esplicito su tali elementi.
    2. Consente di fornire valori di proprietà predefiniti ma sovrascrivibili che controllano l'aspetto del modello. In altre parole, ti consente di rispettare le proprietà del genitore basato su modelli, ma di fornire comunque i tuoi valori predefiniti."

In altre parole, creando uno stile permette all'utente di setter modello dello stile di ignorare i valori impostati, anche se non utilizzano un TemplateBinding ({TemplateBinding larghezza} per esempio). Se si hardcoded the Width nel tuo stile, l'utente dello Style potrebbe ancora sovrascriverlo, ma se hai hardcoded quella proprietà Width in un Template, l'utente è bloccato.

Inoltre, (e questo è un po 'di confusione) quando utilizzando un ContentTemplate con un TemplateBinding l'onere è sull'utente di impostare quella proprietà altrimenti utilizzerà la proprietà predefinita per il TargetType. Se si utilizza uno stile, è possibile sovrascrivere la proprietà predefinita del TargetType utilizzando un setter per la proprietà e quindi applicando un TemplateBinding che fa riferimento a quel setter. Il libro spiega meglio, pagina 338 (Mixing modelli con gli stili)

2

ho trovato alcune interessanti differenze nel The difference between styles and templates (msdn)

Stile: È possibile impostare solo preesistenti proprietà in stile. Ad esempio, non è possibile impostare un valore predefinito per una proprietà che appartiene a una nuova parte aggiunta al modello.

Template: Quando si modifica un modello, si ha accesso a più parti di un controllo rispetto a quando si modifica uno stile. Ad esempio, è possibile modificare il modo in cui l'elenco a comparsa viene visualizzato in una casella combinata o modificare l'aspetto del pulsante che attiva l'elenco a comparsa nella casella combinata modificando il modello degli elementi.


Stile: È possibile utilizzare gli stili per specificare il comportamento predefinito di un controllo. Ad esempio, in uno stile per un pulsante, è possibile specificare un trigger in modo che quando gli utenti spostano il puntatore del mouse sul pulsante, il colore dello sfondo cambierà. Queste modifiche alle proprietà sono istantanee (non è possibile animare in modo graduale).

Modello: È possibile specificare il comportamento di qualsiasi parte nuova o esistente in un modello utilizzando i trigger. Ad esempio, è possibile specificare un trigger in modo che quando gli utenti spostano il puntatore del mouse su un pulsante, il colore di una delle parti cambierà. Queste modifiche alle proprietà possono essere istantanee o animate gradualmente per produrre una transizione uniforme.