Solución:
ContentControl
es una clase base para controles que contienen otros elementos y tienen un Content
-propiedad (por ejemplo, Button
).
ContentPresenter
se utiliza dentro de las 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 se aplican en todos los casos, use su criterio):
- Dentro
ControlTemplate
usarContentPresenter
- Fuera de
ControlTemplate
(inclusoDataTemplate
y plantillas externas) intente no utilizar ninguna de ellas, si es necesario, debe preferirContentPresenter
- Subclase
ContentControl
si está creando un control personalizado “sin apariencia” 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 una ControlTemplate, como un marcador de posición para decir “poner el contenido real aquí”.
Un ContentControl se puede utilizar 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
los 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 podríamos encontrar lo siguiente dentro de su ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
El contenido del ContentPresenter recibirá el valor de MyProperty1
.
Tenga en cuenta que si el nombre de la propiedad es Content
, no es necesario especificar ContentSource
ya que es el valor predeterminado.
Para aquellos que conocen angularJs: esto es similar al mecanismo de transcluir.