Qual è la differenza tra ContentControl e ContentPresenter?
-
18-09-2019 - |
Domanda
Non sono sicuro di quando dovrei usarlo ContentPresenter
invece di ContentControl
(e viceversa).Al momento, sto usando ContentControl
praticamente tutto il tempo nel mio DataTemplate
S.Quando lo farebbe ContentPresenter
essere una scelta migliore?e perché?
Soluzione
ContentControl
è una classe base per i controlli che contengono altri elementi e hanno un Content
-struttura (per esempio, Button
).
ContentPresenter
viene utilizzato all'interno di modelli di controllo per visualizzare il contenuto.
ContentControl
, quando viene utilizzato direttamente (si suppone per essere usato come una classe base), ha un modello di controllo che utilizza ContentPresenter per visualizzare il suo contenuto.
Le mie regole di pollice (non applicabile in tutti i casi, usare il vostro giudizio):
- All'interno uso
ControlTemplate
ContentPresenter
- Al di fuori di
ControlTemplate
(compresiDataTemplate
e modelli esterni) cercare di non utilizzare nessuno di loro, se avete bisogno di, è necessario preferireContentPresenter
-
ContentControl
sottoclasse se si sta creando un custom "lookless" controllare che il contenuto host e non è possibile ottenere lo stesso risultato modificando modello di un controllo esistente (che dovrebbe essere estremamente raro).
Altri suggerimenti
ContentPresenter viene solitamente utilizzato in un ControlTemplate, come segnaposto per indicare "inserisci qui il contenuto effettivo".
Un ContentControl può essere utilizzato ovunque, non necessariamente in un modello.Preleverà qualsiasi DataTemplate definito per il tipo di contenuto assegnatogli
Recentemente ho scritto un post sul mio blog per quanto riguarda questi due comandi:
ContentPresenter vs ContentControl (EDIT:. Errore Link sostituito con versione archiviata)
Il ContentPresenter.ContentSource è ciò che rende in realtà la più grande differenza tra le due classi.
immobili ContentSource ha senso solo all'interno di un ControlTemplate; determina quale struttura TemplatedParent il contenuto deve essere mappato con.
Ad esempio, se un controllo contiene un MyProperty1
proprietà di dipendenza, allora potremmo trovare il seguente all'interno del suo ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
Il contenuto della ContentPresenter riceverà il valore della MyProperty1
.
Si prega di notare che, se il nome della proprietà è Content
, non c'è bisogno di specificare ContentSource
in quanto è il valore predefinito.
Per chi conosce angularJs:. Questo è simile a transclude mecanism
A volte un esempio è più facile che il gergo teorico. In un sito web MS (Scorrere fino alla fine: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter (v = vs.110) .aspx ), si utilizza un pulsante come 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, qualsiasi cosa.
Dopo la personalizzazione di Button, ora sul Xaml, è possibile scrivere
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
Nel codice di esempio precedente, il "mio: Button.Content" è il ContentControl. L'AnotherControl sarà posto a quello che si era specificato dove il ContentPresenter è.
Allo stesso modo, quando paragona TextBox e TextBlock, TextBox ha un ContentPresenter per voi di roba roba in esso, proprio come l'esempio pulsante sopra mentre un TextBlock non lo fa. Un TextBlock consente solo di inserire il testo.
La sua una vecchia questione, ma ho appena finito di sviluppare un controllo delle mattonelle animate, modello basato per un'applicazione universale, guardare a questo codice dal vecchio telefono WP7 / 8 SDK:
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
Qui è possibile vedere il ContentControl è il contenitore e il presentatore per la visualizzazione di contenuti. Nella maggior parte dei casi la ControlTemplate sarà il contenitore, ma se volete nella vostra ControlTemplate
un altro contenitore che si può mettere un contenitore in più: ContentControl
in essa e per la presentazione del contenuto di una ContentPresenter
separata. Se non avete bisogno di un contenitore separato poi basta usare ControlTemplate
e ControlPresenters
per la visualizzazione di blocchi di contenuto Almeno questo è ciò che i ragazzi di Microsoft hanno fatto quando hanno sviluppato l'SDK WP7 / 8. Il ContentControl può essere utilizzato anche per la visualizzazione di contenuti, ma poi serve sia come contenitore e presentatore. Quindi, nel codice di esempio sopra il suo scopo è diviso in un contenitore e presentatore. Nei campioni dinamici, è possibile visualizzare il contenitore (può avere uno sfondo vuoto o qualcosa thats non c'è ancora) e quindi dinamicamente riempirlo con il contenuto presentatore. Un contenitore ha dimensioni (larghezza, altezza, ecc), si mette le proprietà sul controllo contenitore e contenuti presenti in esso. Nel campione del ContentControl determina ciò che deve essere fatto con il contenuto presentatore.