Risposte:
ContentControl
è una classe di base per i controlli che contengono altri elementi e hanno una Content
proprietà (ad esempio Button
).
ContentPresenter
viene utilizzato all'interno dei modelli di controllo per visualizzare il contenuto.
ContentControl
, se usato direttamente (dovrebbe essere usato come classe di base), ha un modello di controllo che utilizza ContentPresenter per visualizzare il suo contenuto.
Le mie regole pratiche (non applicabile in tutti i casi, usa il tuo giudizio):
ControlTemplate
Uso internoContentPresenter
ControlTemplate
( DataTemplate
modelli inclusi e esterni) cerca di non utilizzare nessuno di essi, se necessario, devi preferireContentPresenter
ContentControl
se si sta creando un controllo "lookless" personalizzato che ospita il contenuto e non è possibile ottenere lo stesso risultato modificando il modello di un controllo esistente (che dovrebbe essere estremamente raro).ContentPresenter viene solitamente utilizzato in un ControlTemplate, come segnaposto per dire "inserisci qui il contenuto effettivo".
Un ContentControl può essere utilizzato ovunque, non necessariamente in un modello. Raccoglierà qualsiasi DataTemplate definito per il tipo di contenuto assegnato
Di recente ho scritto un post sul mio blog riguardante questi due controlli:
ContentPresenter vs ContentControl (EDIT: collegamento interrotto sostituito con versione archiviata.)
Il ContentPresenter.ContentSource è ciò che rende in realtà la più grande differenza tra le due classi. La proprietà ContentSource ha senso solo all'interno di ControlTemplate; determina con quale proprietà TemplatedParent deve essere mappato il contenuto. Ad esempio, se un controllo contiene una proprietà di dipendenza MyProperty1
, allora potremmo trovare quanto segue al suo interno ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
Il contenuto di ContentPresenter riceverà il valore di MyProperty1
.
Si noti che se il nome della proprietà è Content
, non è necessario specificare ContentSource
poiché è il valore predefinito.
Per coloro che conoscono angularJs: questo è simile al transclude mecanismo.
È una vecchia domanda ma stavo solo finendo di sviluppare un Tile Control animato, modello basato su un'app universale, guarda questo codice dal vecchio SDK WP7 / 8 del telefono:
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
Qui puoi vedere ContentControl è il Contenitore e il Presenter per la visualizzazione del contenuto. Nella maggior parte dei casi, ControlTemplate sarà il contenitore, ma se si desidera in un ControlTemplate
altro contenitore è possibile inserire un contenitore aggiuntivo: ContentControl
in esso e per presentare il contenuto separatamente ContentPresenter
. Se non hai bisogno di un contenitore separato, usa semplicemente ControlTemplate
eControlPresenters
per la visualizzazione di blocchi di contenuto, almeno è quello che hanno fatto i ragazzi di Microsoft quando hanno sviluppato l'SDK WP7 / 8. ContentControl può anche essere utilizzato per visualizzare il contenuto, ma serve sia come contenitore che come presentatore. Quindi nel codice di esempio sopra il suo scopo è suddiviso in Contenitore e Presentatore. In esempi dinamici è possibile visualizzare il contenitore (può avere uno sfondo vuoto o qualcosa che non è ancora presente) e quindi riempirlo dinamicamente con il contenuto del presentatore. Un contenitore ha dimensioni (larghezza, altezza ecc.), Metti quelle proprietà sul controllo contenitore e presenti il contenuto su di esso. Nell'esempio ContentControl determina cosa deve essere fatto con il contenuto del presentatore.
A volte un esempio è più semplice del gergo teorico. In un sito Web MS (scorrere verso il basso: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx ), utilizza un pulsante come un esempio. Un pulsante ha un ContentControl, che consente di posizionare un controllo o un controllo personalizzato che potrebbe essere un'immagine, testo, checkBox, StackPanel, griglia, qualunque cosa.
Dopo la personalizzazione di Button, ora su Xaml, puoi scrivere
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
Nel codice di esempio sopra, "my: Button.Content" è ContentControl. AnotherControl sarà collocato in base a quanto specificato in ContentPresenter.
Allo stesso modo, quando confronta TextBox e TextBlock, TextBox ha un ContentPresenter per farci roba in esso proprio come nell'esempio Button sopra mentre un TextBlock no. Un blocco di testo consente solo di inserire il testo.
Button
non ha un [ ContentControl
] (msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (v = vs.110) .aspx), è un (eredita da) ContentControl
. L' Button
ha un ContentPresenter
. Nota che puoi farlo con lo standard Button
, non è necessario personalizzarlo.
ContentPresenter
, a ContentControl
non possa essere usato altrettanto bene nella ControlTemplate
visualizzazione del contenuto di Button
. Come tale, non risponde alla domanda.