Pregunta

No estoy seguro de cuando debería utilizar ContentPresenter en lugar de ContentControl (y viceversa). Por el momento, estoy usando ContentControl casi todo el tiempo en mis DataTemplates. Cuando se ContentPresenter ser una mejor opción? y por qué?

¿Fue útil?

Solución

ContentControl es una clase base para los controles que contienen otros elementos y tienen un Content-propiedad (por ejemplo, Button).

ContentPresenter se utiliza dentro de las plantillas de control para mostrar el contenido.

ContentControl, cuando se usa directamente (que se supone que se utilizará como una clase base), tiene una plantilla de control que utiliza ContentPresenter para mostrar su contenido.

Mis reglas de oro (no aplicable en todos los casos, utilice su juicio):

  1. Dentro de uso ControlTemplate ContentPresenter
  2. Fuera de ControlTemplate (incluyendo DataTemplate y las plantillas externas) trate de no usar cualquiera de ellos, si es necesario, se debe preferir ContentPresenter
  3. ContentControl Subclase si está creando una costumbre "lookless" controlar que los contenidos de acogida y no se puede obtener el mismo resultado cambiando la plantilla de un control existente (que debería ser extremadamente raro).

Otros consejos

ContentPresenter se utiliza generalmente en una ControlTemplate, como un marcador de posición para decir "poner el contenido real aquí".

A ContentControl se puede utilizar en cualquier lugar, no necesariamente en una plantilla. Se recogerá cualquier DataTemplate definido para el tipo de contenido asignado a ella

Hace poco escribí un post en mi blog con respecto a estos dos controles:

ContentPresenter vs ContentControl (EDIT:. un enlace roto reemplazado con versión archivada)

La ContentPresenter.ContentSource es lo que realmente hace la mayor diferencia entre las dos clases. ContentSource propiedad sólo tiene sentido dentro de un ControlTemplate; se determina que la propiedad TemplatedParent el contenido debe ser mapeada con.  Por ejemplo, si un control contiene un MyProperty1 propiedad de dependencia, entonces podríamos encontrar lo siguiente dentro de su ControlTemplate:

<ControlTemplate TargetType="MyControl" >
    [...]
       <ContentPresenter ContentSource="MyProperty1" />
    [...]
</ControlTemplate>

El contenido de la ContentPresenter recibirá el valor de MyProperty1.

Tenga en cuenta que si el nombre de la propiedad es Content, no hay necesidad de especificar ContentSource ya que es el valor por defecto.

Para aquellos que conocen AngularJS:. Esto es similar a transcluirla MECANISMO

A veces, un ejemplo es más fácil que la jerga teórica. En un sitio web MS (Desplácese a la parte inferior: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter (v = vs.110) .aspx ), se utiliza un botón como un ejemplo . Un botón tiene un ContentControl, lo que le permite realizar un control o un control personalizado que podría ser una imagen, texto, CheckBox, StackPanel, Cuadrícula, lo que sea.

Después de la personalización del botón, ahora en el XAML, puede escribir

<my:Button>
   <my:Button.Content>
      <my:AnotherControl>
   </my:Button.Content>
</my:Button>

En el código de ejemplo anterior, el "mi: Button.Content" es la ContentControl. El AnotherControl será lugar a lo que ya había indicado que el ContentPresenter es.

Del mismo modo, cuando se compara cuadro de texto y TextBlock, cuadro de texto tiene un ContentPresenter para usted para rellenar cosas en él al igual que el ejemplo anterior, mientras que un botón TextBlock no lo hace. Un TextBlock sólo permite la entrada de texto.

Su una vieja pregunta, pero yo estaba terminando el desarrollo de un control del azulejo animada, basada en la plantilla para una aplicación universal, mira el código del viejo teléfono WP7 / 8 SDK:

<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
    <ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>

Aquí se puede ver el ContentControl es el contenedor y el presentador para mostrar el contenido. En la mayoría de los casos el ControlTemplate será el contenedor, pero si usted desea en su ControlTemplate otro recipiente se puede poner un recipiente extra: ContentControl en ella y para presentar el contenido de una ContentPresenter separada. Si usted no necesita un recipiente separado y luego sólo tiene que utilizar ControlTemplate y ControlPresenters para la visualización de bloques de contenido, al menos, eso es lo que los chicos de Microsoft hicieron cuando se desarrolló el SDK WP7 / 8. El ContentControl también se puede utilizar para la visualización de contenido, pero entonces sirve como contenedor y presentador. Así que en el código de ejemplo por encima de su objetivo está dividido en un recipiente y presentador. En las muestras dinámicas que podría mostrar el recipiente (que puede tener un fondo vacío o algo eso no es todavía) y luego dinámicamente llenarlo con el contenido presentador. Un recipiente tiene dimensiones (anchura, altura, etc.), se pone esas propiedades en el control contenedor y el contenido presente en él. En la muestra del ContentControl determina lo que se tiene que hacer con el contenido presentador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top