custom color change bar wpf xaml styles

custom - change color title bar wpf



¿Puedes definir múltiples TargetTypes para un estilo XAML? (5)

En HTML / CSS puede definir un estilo que se puede aplicar a muchos tipos de elementos, por ejemplo:

.highlight { color:red; }

se puede aplicar tanto a P como a DIV, por ejemplo:

<p class="highlight">this will be highlighted</p> <div class="highlight">this will also be highlighted</div>

pero en XAML parece que tienes que definir TargetType para estilos, de lo contrario, obtienes un error:

<Style x:Key="formRowLabel" TargetType="TextBlock">

¿Hay alguna manera de permitir que un estilo XAML se aplique a múltiples elementos o incluso dejarlo abierto como en CSS?


Hay una respuesta alternativa a la pregunta. PUEDE dejar el parámetro TargetType fuera del estilo, lo que le permitirá aplicarlo a varios controles diferentes, pero solo si prefija el nombre de la propiedad con "Control".

<Style x:Key="Highlight"> <Setter Property="Control.Foreground" Value="Red"/> </Style>

Obviamente, esto solo funciona para las propiedades de la clase de control base. Si intentas establecer ItemsSource decir, fallaría porque no hay Control.ItemsSource


Los ajustadores en estilos WPF se verifican durante el tiempo de compilación; Los estilos CSS se aplican dinámicamente.

Debe especificar un tipo para que WPF pueda resolver las propiedades en los ajustadores a las propiedades de dependencia de ese tipo.

Puede establecer el tipo de destino para las clases base que contienen las propiedades que desea y luego aplicar ese estilo a las clases derivadas. Por ejemplo, puede crear un estilo para objetos de control y luego aplicarlo a varios tipos de controles (botón, cuadro de texto, casilla de verificación, etc.)

<Style x:Key="Highlight" TargetType="{x:Type Control}"> <Setter Property="Foreground" Value="Red"/> </Style>

...

<Button Style="{StaticResource Highlight}" Content="Test"/> <TextBox Style="{StaticResource Highlight}" Text="Test"/> <CheckBox Style="{StaticResource Highlight}" Content="Test"/>


Quería aplicar un estilo a un Textblock y un TextBox pero la respuesta seleccionada no me funcionaba porque Textblock no hereda de Control, en mi caso quería afectar la propiedad Visibilidad, así que usé FrameworkElement

<Style x:Key="ShowIfRequiredStyle" TargetType="{x:Type FrameworkElement}"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding ShowIfRequiredStyle, UpdateSourceTrigger=PropertyChanged}" Value="true"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> </Style.Triggers> </Style> <TextBlock Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/> <TextBox Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/>

Esto funciona para la propiedad Visibilidad porque ambos elementos heredan de Frameworkelement y la propiedad se define allí. Por supuesto, esto no funcionará para propiedades definidas solo en Control, puede buscar en el árbol de jerarquía y tratar de encontrar una clase base, de todos modos pensé que esto podría ayudar a alguien ya que este es un resultado de búsqueda superior y la respuesta seleccionada es un poco incompleta.


Tengo esto funcionando

<Style x:Key="HeaderStyleThin" TargetType="{x:Type Border}"> <Setter Property="Background" Value="Black" /> <Style.Resources> <Style TargetType="{x:Type TextBlock}"> <Setter Property="Background=" Value="Red" /> </Style> </Style.Resources> </Style>


<!-- Header text style --> <Style x:Key="headerTextStyle"> <Setter Property="Label.VerticalAlignment" Value="Center"></Setter> <Setter Property="Label.FontFamily" Value="Trebuchet MS"></Setter> <Setter Property="Label.FontWeight" Value="Bold"></Setter> <Setter Property="Label.FontSize" Value="18"></Setter> <Setter Property="Label.Foreground" Value="#0066cc"></Setter> </Style> <!-- Label style --> <Style x:Key="labelStyle" TargetType="{x:Type Label}"> <Setter Property="VerticalAlignment" Value="Top" /> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="FontWeight" Value="Bold" /> <Setter Property="Margin" Value="0,0,0,5" /> </Style>

Creo que estos dos métodos para declarar un estilo podrían responder a su pregunta. En el primero, no se especifica TargetType, pero los nombres de las propiedades llevan el prefijo ''Label''. En el segundo, el estilo se crea para los objetos Label.

Otro método para hacerlo es:

<UserControl.Resources> <Style x:Key="commonStyle" TargetType="Control"> <Setter Property="FontSize" Value="24"/> </Style> <Style BasedOn="{StaticResource commonStyle}" TargetType="ListBox"/> <Style BasedOn="{StaticResource commonStyle}" TargetType="ComboBox"/> </UserControl.Resources>