trigger style c# wpf silverlight targettype

c# - style - wpf trigger



¿Puedo tener un estilo con TargetType múltiple en WPF? (5)

Como titulado, y me refiero a algo como a continuación:

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

Esto es realmente por el uso de un control de terceros, he heredado su clase. Pero la plantilla no se aplica a la Subclase porque TargetType está en la clase base. Entonces me gustaría establecer múltiples TargetType para que pueda aplicar para ambos.


De hecho, descubrí que en una grilla solo puedes establecer el estilo de un elemento. Sin embargo, en un panel de distribución puede establecer el estilo de varios elementos.

Vea este código:

<Grid> <StackPanel> <StackPanel.Resources> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="12"></Setter> <Setter Property="VerticalAlignment" Value="Center"></Setter> <Setter Property="HorizontalAlignment" Value="Center"></Setter> <Setter Property="Margin" Value="5"></Setter> </Style> <Style TargetType="TextBox"> <Setter Property="Width" Value="100"></Setter> <Setter Property="Height" Value="25"></Setter> <Setter Property="Margin" Value="5"></Setter> </Style> <Style TargetType="Button"> <Setter Property="Margin" Value="5"></Setter> <Setter Property="Height" Value="30"></Setter> <Setter Property="Width" Value="100"></Setter> </Style> </StackPanel.Resources> <StackPanel Orientation="Horizontal"> <TextBlock>Kanban ID</TextBlock> <TextBox></TextBox> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock>Customer Name</TextBlock> <TextBox></TextBox> </StackPanel> <Button>Save</Button> </StackPanel> </Grid>

Si quitaras el lugar debajo de y cambias a verás que los objetos no están configurados, solo cambian las propiedades del último objeto.

Espero que esto ayude.


La respuesta es no.

TargetType es una propiedad de Style y solo se puede establecer una vez. Para asegurar el tipo de seguridad, el estilo debe apuntar a un tipo específico para saber qué propiedades establecer.

Sin embargo, hay una solución. Puede tomar las propiedades comunes de todos los tipos que tiene y definirlos en un estilo. Luego, BasedOn estilos específicos para cada uno de los controles específicos y use la propiedad BasedOn para heredar del estilo básico.


No, no puede, sin embargo, a menudo creo un estilo para una clase base compartida como FrameworkElement , y luego creo mis estilos de control individuales BasedOn el estilo base.

<Style TargetType="{x:Type FrameworkElement}"> <!-- Shared Setters --> </Style> <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> <Style TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type FrameworkElement}}" /> <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />


Según la respuesta de Rachel, para obtener un código más limpio, puede eliminar la x: escriba dentro de la extensión de marcado y solo use el tipo:

<Style TargetType="Label"> <!-- Shared Setters --> </Style>

Es lo mismo que:

<Style TargetType="{x:Type Label}"> <!-- Shared Setters --> </Style>


Una variación más flexible de la respuesta de Rachel es usar resourceKey para BasedOn.

Entonces, en lugar de:

<Style TargetType="{x:Type FrameworkElement}"> <!-- Shared Setters --> </Style> <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />


Haz algo como:

<Style x:Key="commonStyle" TargetType="{x:Type FrameworkElement}"> <!-- Shared Setters --> </Style> <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource commonStyle}" />


Esto ofrece más opciones ya que algunos estilos se pueden basar en commonStyle, y algunos en por ejemplo commonStyle2, donde commonStyle y commonStyle2 tienen FrameworkElement como tipo de destino.