Saltar al contenido

¿Cuál es la diferencia entre ContentControl y ContentPresenter?

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

  1. Dentro ControlTemplate usar ContentPresenter
  2. Fuera de ControlTemplate (incluso DataTemplate y plantillas externas) intente no utilizar ninguna de ellas, si es necesario, debe preferir ContentPresenter
  3. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *