2009-06-22 14 views
39

Estaba hurgando un poco en WPF y quería que todos los elementos de mi ventana compartieran el mismo margen. me encontré con que todos los controles que son capaces de tener un margen derivan de FrameworkElement lo que he intentado lo siguiente:Establecer la propiedad TargetType de un estilo en una clase base

<Window.Resources> 
<Style TargetType="{x:Type FrameworkElement}"> 
    <Setter Property="Margin" Value="10" /> 
</Style> 
</Window.Resources> 

Y, esto no funciona. Puedo aplicar esto a todos los botones, pero no a todos los elementos que se derivan del botón. ¿Me estoy perdiendo algo o simplemente esto no es posible?

¿Soy el único que siente que usar CSS para WPF hubiera sido una buena idea?

+2

Sé que esta es una publicación anterior pero no eres la única. CSS no es perfecto, pero hubiera sido una buena idea usar algo que no sea "triste" que CSS. –

Respuesta

54

Desafortunadamente, no puede aplicar estilos al tipo base FrameworkElement; mientras que WPF le permitirá escribir el estilo, no lo aplicará a los controles que se derivan de él. Parece que esto también se aplica a subtipos de FrameworkElement, p. Ej. ButtonBase, el supertipo de Button/ToggleButton/RepeatButton.

Puede seguir usando la herencia, pero tendrá que usar la sintaxis explícita BasedOn para aplicarla a los tipos de control a los que desea que se aplique.

<Window.Resources> 
    <Style TargetType="{x:Type FrameworkElement}"> 
     <Setter Property="Margin" Value="10" /> 
    </Style> 

    <Style TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 
    <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> 

</Window.Resources> 

+1

Gracias. Pensé en eso también, pero se siente terriblemente lento si quisiera que se aplicara un estilo a TODOS los elementos que están en una ventana. – Tigraine

+4

No funciona aquí. Obtengo una XamlParseException que dice que TargetType no coincide con el otro tipo. Lo probé en mi clase derivada de Button y en el botón normal. – ygoe

+1

¿Existe alguna forma mejor de aplicar un estilo global a TODOS los controles en la aplicación? – Shimmy

7

La cuestión es que en la búsqueda de un estilo de WPF no busca a través de todas las clases de las que deriva el actual. Sin embargo, puede darle una clave al estilo y aplicarlo a todos los elementos para los cuales desea tener una propiedad común. Si se especifica una propiedad en el estilo que no se puede aplicar al elemento que está diseñando, se ignorará.

Cuestiones relacionadas