wpf - para - Establecer la propiedad TargetType de un estilo en una clase base
estilos para botones wpf (2)
Estaba hurgando un poco en WPF y quería que todos los elementos de mi ventana compartieran el mismo margen. Descubrí que todos los controles que pueden tener un margen se derivan de FrameworkElement, por lo que probé lo siguiente
<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 esto simplemente no es posible?
¿Soy el único que siente que usar CSS para WPF hubiera sido una buena idea?
Desafortunadamente, no puede aplicar estilos al tipo básico de FrameworkElement; Si bien 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 los subtipos de FrameworkElement, por ejemplo, ButtonBase, el supertipo de Button / ToggleButton / RepeatButton.
Aún puede usar la herencia, pero tendrá que usar la sintaxis BasedOn
explícita 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>
El problema es que cuando se busca un estilo, WPF no busca en todas las clases de las que se deriva el actual. Sin embargo, puede darle al estilo una clave y aplicarlo a todos los elementos para los que 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á.