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 DataTemplateS.Quando lo farebbe ContentPresenter essere una scelta migliore?e perché?

È stato utile?

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

  1. All'interno uso ControlTemplate ContentPresenter
  2. Al di fuori di ControlTemplate (compresi DataTemplate e modelli esterni) cercare di non utilizzare nessuno di loro, se avete bisogno di, è necessario preferire ContentPresenter
  3. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top