2011-02-02 9 views
6

Me lo he estado preguntando desde que empecé a usar ejemplos de plantillas de control de MS como base para crear controles personalizados.¿Por qué definir una Plantilla dentro de un Estilo en xaml, WPF?

tomar el ejemplo Label por ejemplo: http://msdn.microsoft.com/en-us/library/ms752327.aspx

por qué en la tierra es que define así:

<Style x:Key="{x:Type Label}" TargetType="Label"> 
    <Setter Property="HorizontalContentAlignment" Value="Left" /> 
    <Setter Property="VerticalContentAlignment" Value="Top" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Label"> 
     <Border> 
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          RecognizesAccessKey="True" /> 
     </Border> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Foreground"> 
       <Setter.Value> 
       <SolidColorBrush Color="{DynamicResource DisabledForegroundColor}" /> 
       </Setter.Value> 
      </Setter> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

y no como esto directamente:

<ControlTemplate x:Key="{x:Type Label}" TargetType="Label"> 
    <Border> 
     <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
         VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
         RecognizesAccessKey="True" /> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="false"> 
     <Setter Property="Foreground"> 
      <Setter.Value> 
      <SolidColorBrush Color="{DynamicResource DisabledForegroundColor}" /> 
      </Setter.Value> 
     </Setter> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

y luego llamado como una plantilla directamente y no a través de la propiedad de estilo?

¿Hay alguna razón oculta que no veo para hacer cosas como esta? o es solo una forma de hacer las cosas y eso es todo?

(NB: no me digas que esto es debido a los emisores de alineación horizontal y vertical que todos sabemos que esos son los valores por defecto para una etiqueta y esto es básicamente inútil si mantiene esos valores)

Respuesta

8

Sin utilizando un Estilo no es posible asignar automáticamente la plantilla a todas las instancias de un tipo de control específico. El ajuste x:Key="{x:Type Label}" para la plantilla de control no no aplica automáticamente esta plantilla a todos los controles del tipo Etiqueta.

Puede hacer un estilo se aplica a todos los botones debajo de la declaración en el árbol visual ajustando el TargetType a Button, pero no se puede hacer lo mismo con una plantilla, si no lo envuelve dentro de un estiloque tienen un Setter para la plantilla.

Además, tenga en cuenta que en su ejemplo se pueden intercambiar

<Style x:Key="{x:Type Label}" TargetType="Label"> 

Con

<Style TargetType="Label"> 

A medida que el x:Key se establece en el TargetType si se omite la definición x:Key.

+0

oy, pensé que funcionaba igual para plantillas y estilos. Lo intentaré solo para verlo con mis propios ojos (no puedo creer que esos 2 actúen de forma diferente ...) en cuanto a la segunda parte de tu respuesta, tengo que estar en desacuerdo (ya viste mi otra pregunta sobre el tema) . Todavía no he encontrado una explicación válida para el comportamiento que estoy obteniendo, pero quitar la tecla x: no siempre funciona como debería (al menos para mí ...) – David

+1

Está hecho específicamente para estilos, que si no se define el estilo para un control, recorrerá el árbol visual hasta que encuentre una definición de estilo con x: clave igual a su propio tipo, y luego aplicará ese estilo a sí mismo. La misma lógica no se implementa para las plantillas (o cualquier otro tipo de recursos para el caso), por lo que no es realmente tan extraño;) –

+0

bien, lo vi con mis propios ojos. Debería haberlo intentado antes de preguntar en realidad. De hecho, es incluso peor que eso: después de compilar, aparece un error que dice que es imposible incluir un Estilo en una Plantilla de Control. Entonces esto tiene sentido con lo que escribiste. Pensé que esto funcionaría tanto para las plantillas como para los estilos ... (¿por qué no?) – David

Cuestiones relacionadas