2011-05-26 20 views
46

¿Podría decirme cuáles son las principales diferencias entre Style y ControlTemplate? ¿Cuándo o por qué usar uno u otro?Diferencia entre Style y ControlTemplate

A mis ojos, son exactamente el mismo mismo. Como soy principiante, creo que estoy equivocado, por lo tanto, mi pregunta.

+1

Relacionados: [ItemTemplate vs ControlTemplate] (http://stackoverflow.com/questions/575389/itemtemplate-vs-controltemplate) – Helen

+2

Recurso de MSDN, La diferencia entre estilos y plantillas: http://msdn.microsoft.com/ es-us/library/cc295273% 28v = expression.40% 29.aspx –

Respuesta

23

No, de hecho, estás bastante equivocado. Los estilos establecen las propiedades en los controles. ControlTemplate es una propiedad compartida por la mayoría de los controles que especifican cómo se representan.

Para elaborar, puede usar un estilo para agrupar la configuración de un grupo de propiedades para que pueda volver a utilizar eso para estandarizar sus controles. Los estilos pueden establecerse explícitamente en los controles o aplicarse también a todos los de un tipo determinado.

Las plantillas de control se pueden establecer por un estilo o establecer explícitamente en un control para cambiar la forma en que aparece. Todos los controles tienen plantillas predeterminadas (y estilos para el caso) que están incrustadas en los ensamblados .net wpf. Es bastante esclarecedor ver esto y comprender cómo los desarrolladores de wpf implementaron las versiones normales de todos los controles. Si tiene instalado Expression blend, mire en su carpeta "SystemThemes".

ACTUALIZACIÓN:

Para entender cómo los estilos y ControlTemplates pueden "agregar controles". De alguna forma u otra, la ControlTemplate es la única forma de definir los controles que componen un control de. Sin embargo, algunos controles .net predeterminados le permiten usar controles en lugar de texto.

Por ejemplo:

<GroupBox> 
    <GroupBox.Header> 
    <CheckBox/> 
    </GroupBox.Header> 
</GroupBox> 

Este "agrega" una casilla de verificación a la caja de grupo sin cambiar el ControlTemplate, pero esto se debe a que el valor por defecto ControlTemplate para GroupBox permite nada como el encabezado. Esto se hace mediante el uso de controles especiales como ContentPresenter.

Sin embargo, a veces el ControlTemplate predeterminado para un control no le permite cambiar algo que desea cambiar mediante propiedades. Entonces debes cambiar la plantilla de control.

Ya sea que establezca las Propiedades de un control (Contenido, Encabezado, ControlTemplate, IsEnabled, etc.) directamente o mediante un estilo no importa, los Estilos son solo una conveniencia.

Esperemos que esto responda a su pregunta con mayor claridad.

+1

Está bien, pero en el proyecto en el que estoy trabajando, ambos se usaron para agregar otros controles a algunos controles ... y también para establecer propiedades ... entonces no veo la diferencia en su uso? ? ? –

53

En un estilo, establece las propiedades de un control.

<Style x:Key="MyButtonStyle" TargetType="Button"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

<Button Style="{StaticResource MyButtonStyle}"/> 

Todos los botones que utilizan este estilo tendrán sus fondos en rojo.

En una plantilla, define la UI (estructura) del control.

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button"> 
    <Grid> 
     <Rectangle Fill="Green"/> 
     <ContentPresenter/> 
    </Grid> 
</ControlTemplate> 

<Button Template="{StaticResource MyButtonTemplate}"/> 

Todos los botones que utilizan esta plantilla tendrán un fondo verde que no se puede cambiar.

Los valores establecidos en una plantilla solo pueden reemplazarse al reemplazar toda la plantilla. Los valores en un estilo se pueden reemplazar estableciendo el valor explícitamente cuando se usa el control. Es por eso que es mejor utilizar las propiedades del control mediante el uso de TemplateBinding en lugar de valores de codificación.

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button"> 
    <Grid> 
     <Rectangle Fill="{TemplateBinding Background}"/> 
     <ContentPresenter/> 
    </Grid> 
</ControlTemplate> 

Ahora la plantilla utiliza el valor de la propiedad de fondo del botón que se aplica, por lo que se puede personalizar:

<Button Template="{StaticResource MyButtonTemplate}" Background="Yellow"/> 

Otra característica útil es que los controles pueden recoger un estilo por defecto sin tener un estilo específico asignado a ellos. No puedes hacer eso con una plantilla.

Simplemente elimine el atributo x: Key del estilo (nuevamente: no puede hacer esto con las plantillas). Todos los botones en el árbol visual debajo del estilo tendrán este estilo aplicado.

Combinando plantillas y estilos es de gran alcance adicional: se puede establecer la propiedad Template del universo:

<Style TargetType="Button"> 
    <Setter Property="Background" Value="Red"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Grid> 
        <Rectangle Fill="{TemplateBinding Background"/> 
        <ContentPresenter/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+3

Así que su ejemplo se ajusta exactamente a la pregunta que me pregunto ... ¿cuál es la diferencia entre una plantilla de control y un estilo que SOLO define una plantilla de control? ¿Es común siempre encapsular controltemplate por Styles? –

13

Se puede pensar en un estilo como una manera conveniente de aplicar un conjunto de valores de propiedad a más de una elemento. Puede cambiar la apariencia predeterminada estableciendo propiedades, como FontSize y FontFamily, en cada elemento de TextBlock directamente. Sin embargo, si desea que sus elementos TextBlock compartan algunas propiedades, puede crear un Estilo en la sección Recursos de su archivo XAML.

Por otro lado, un ControlTemplate especifica la estructura visual y el comportamiento visual de un control. Puede personalizar la apariencia de un control dándole un nuevo ControlTemplate. Cuando crea un ControlTemplate, reemplaza la apariencia de un control existente sin cambiar su funcionalidad. Por ejemplo, puede hacer que los botones queden en la ronda de la aplicación en lugar de la forma cuadrada predeterminada, pero el botón seguirá generando el evento Click.

Ref: http://msdn.microsoft.com/en-us/library/ms745683.aspx

0

OK, yo tenía exactamente la misma pregunta y las respuestas que he encontrado en este hilo me señaló en la dirección correcta por lo que estoy compartiendo, aunque sólo sea para que pueda entender mejor yo mismo.

Un estilo es más flexible que un ControlTemplate.

De de Windows Presentation Foundation Desencadenada, Adam Nathan y pandillas estado presente (escritores):

  • "Además de la conveniencia de combinar una plantilla [con un estilo utilizando colocador ControlTemplate del Estilo] con la propiedad arbitraria ajustes, hay ventajas importantes de hacer esto [el establecimiento de la incubadora ControlTemplate en un estilo]:.

    1. se le da el efecto de las plantillas predeterminadas Por ejemplo, cuando un estilo mecanografiada se aplica a el Por defecto, y que Style contiene una plantilla de control personalizada, la plantilla de control se aplica sin ninguna marca explícita en esos elementos.
    2. Le permite proporcionar valores de propiedad predeterminados pero anulables que controlan el aspecto de la plantilla. En otras palabras, le permite respetar las propiedades del elemento principal con plantilla, pero aún así proporcionar sus propios valores predeterminados."

En otras palabras, la creación de un estilo permite al usuario de la moda Plantilla del estilo para anular establecen los valores, incluso si no utilizan un TemplateBinding ({TemplateBinding Ancho}, por ejemplo). Si codificado el Ancho en su estilo, el usuario del Estilo aún podría anularlo, pero si codificó esa propiedad de Ancho en una Plantilla, el usuario está atascado.

Además, (y esto es un poco confuso) cuando Uso de ContentTemplate con TemplateBinding La responsabilidad recae en el usuario para establecer esa propiedad, de lo contrario usará la propiedad predeterminada para TargetType. Si usa un estilo, puede anular la propiedad predeterminada del TargetType utilizando un setter para la propiedad y luego aplicando una referencia de TemplateBinding a ese setter. El libro lo explica mejor, página 338 (Mezcla de plantillas con estilos)

2

he encontrado algunas diferencias interesantes en The difference between styles and templates (msdn)

Estilo: Puede establecer sólo pre-existentes propiedades en el estilo. Por ejemplo, no puede establecer un valor predeterminado para una propiedad que pertenece a una nueva pieza que agregó a la plantilla.

Plantilla: Al modificar una plantilla, tiene acceso a más partes de un control que cuando se modifica un estilo. Por ejemplo, puede cambiar la forma en que aparece la lista emergente en un cuadro combinado, o cambia la apariencia del botón que desencadena la lista emergente en el cuadro combinado al modificar la plantilla de elementos.


Estilo: Puede utilizar estilos para especificar el comportamiento predeterminado de un control. Por ejemplo, en un estilo para un botón, puede especificar un desencadenador para que cuando los usuarios muevan el puntero del mouse sobre el botón, el color de fondo cambie. Estos cambios de propiedad son instantáneos (no se pueden animar gradualmente).

Plantilla: Puede especificar el comportamiento de las partes nuevas y existentes en una plantilla mediante el uso de disparadores. Por ejemplo, puede especificar un disparador para que cuando los usuarios muevan el puntero del mouse sobre un botón, cambie el color de una de las partes. Estos cambios de propiedad pueden ser instantáneos o animados gradualmente para producir una transición suave.

Cuestiones relacionadas