Respuestas:
ContentControl
es una clase base para controles que contienen otros elementos y tienen una Content
propiedad (por ejemplo Button
).
ContentPresenter
se usa dentro de plantillas de control para mostrar contenido.
ContentControl
, cuando se usa directamente (se supone que debe usarse como una clase base), tiene una plantilla de control que usa ContentPresenter para mostrar su contenido.
Mis reglas generales (no aplicable en todos los casos, use su criterio):
ControlTemplate
Uso interiorContentPresenter
ControlTemplate
(incluidas DataTemplate
y fuera de las plantillas) intente no usar ninguna de ellas, si es necesario, debeContentPresenter
ContentControl
si está creando un control "sin apariencia" personalizado que aloja contenido y no puede obtener el mismo resultado cambiando la plantilla de un control existente (eso debería ser extremadamente raro).ContentPresenter se usa generalmente en un ControlTemplate, como un marcador de posición para decir "poner el contenido real aquí".
Un ContentControl se puede usar en cualquier lugar, no necesariamente en una plantilla. Recogerá cualquier DataTemplate definido para el tipo de contenido asignado.
Recientemente escribí una publicación en mi blog sobre estos dos controles:
ContentPresenter vs ContentControl (EDITAR: enlace roto reemplazado por versión archivada).
El ContentPresenter.ContentSource es lo que realmente hace la mayor diferencia entre las dos clases. La propiedad ContentSource solo tiene sentido dentro de ControlTemplate; determina con qué propiedad TemplatedParent se debe asignar el contenido. Por ejemplo, si un control contiene una propiedad de dependencia MyProperty1
, entonces podemos encontrar lo siguiente dentro de su ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
El contenido de ContentPresenter recibirá el valor de MyProperty1
.
Tenga en cuenta que si el nombre de la propiedad es Content
, no es necesario especificarlo, ContentSource
ya que es el valor predeterminado.
Para aquellos que conocen angularJs: esto es similar al mecanismo de transcluir.
Es una pregunta antigua, pero estaba terminando de desarrollar una plantilla animada de Tile Control, basada en una aplicación universal, mira este código del antiguo SDK del teléfono WP7 / 8:
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
Aquí puede ver que ContentControl es el Contenedor y el Presentador para mostrar contenido. En la mayoría de los casos, ControlTemplate será el Contenedor, pero si lo desea en su ControlTemplate
otro contenedor, puede colocar un Contenedor adicional: ContentControl
en él y para presentar el contenido por separado ContentPresenter
. Si no necesita un recipiente separado, simplemente use ControlTemplate
yControlPresenters
por mostrar bloques de contenido, al menos eso es lo que hicieron los chicos de Microsoft cuando desarrollaron el SDK WP7 / 8. ContentControl también se puede usar para mostrar contenido, pero luego sirve como contenedor y presentador. Entonces, en el código de muestra anterior, su propósito se divide en Contenedor y Presentador. En las muestras dinámicas, puede mostrar el contenedor (puede tener un fondo vacío o algo que todavía no está allí) y luego llenarlo dinámicamente con el contenido del presentador. Un contenedor tiene dimensiones (ancho, alto, etc.), usted coloca esas propiedades en el control del contenedor y presenta el contenido en él. En la muestra, ContentControl determina qué se debe hacer con el contenido del presentador.
A veces un ejemplo es más fácil que la jerga teórica. En un sitio web de MS (Desplácese hasta la parte inferior: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx ), utiliza un botón como un ejemplo. Un botón tiene un ContentControl, que le permite colocar un control o un control personalizado que podría ser una Imagen, Texto, CheckBox, StackPanel, Grid, lo que sea.
Después de la personalización de Button, ahora en Xaml, puede escribir
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
En el código de ejemplo anterior, "my: Button.Content" es ContentControl. El AnotherControl colocará lo que había especificado donde está ContentPresenter.
De manera similar, cuando compara TextBox y TextBlock, TextBox tiene un ContentPresenter para que usted pueda rellenar cosas como en el ejemplo de Button anterior, mientras que un TextBlock no. Un TextBlock solo le permite ingresar texto.
Button
no tiene un [ ContentControl
] (msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (v = vs.110) .aspx), es un (hereda de) ContentControl
. El Button
tiene un ContentPresenter
. Tenga en cuenta que puede hacerlo con el estándar Button
, sin necesidad de personalizarlo.
ContentPresenter
, a ContentControl
, no podría usarse tan bien ControlTemplate
para mostrar el contenido de Button
. Como tal, no responde la pregunta.