Pergunta

Em HTML / CSS você pode definir um estilo que pode ser aplicado a muitos tipos de elementos, p.ex.:.

.highlight {
    color:red;
}

pode ser aplicada a ambos P e DIV, por exemplo:.

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

mas em XAML parece que você tem para definir o TargetType de estilos, caso contrário, você obterá um erro:

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

Existe uma maneira de permitir um estilo de XAML a ser aplicado a vários elementos ou mesmo para deixá-la aberta como em CSS?

Foi útil?

Solução

Os setters em estilos WPF são verificados durante tempo de compilação; Os estilos CSS são aplicadas de forma dinâmica.

Você tem que especificar um tipo para que WPF pode resolver as propriedades nas setters para as propriedades de dependência desse tipo.

Você pode definir o tipo de destino para classes de base que contêm as propriedades que deseja e, em seguida, aplicar esse estilo para classes derivadas. Por exemplo, você pode criar um estilo para objetos de controle e, em seguida, aplicá-la a vários tipos de controles (Button, TextBox, CheckBox, 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"/>

Outras dicas

<!-- 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>

Eu acho que ambos os métodos de declarar um estilo pode responder a sua pergunta. Na primeira, não há TargetType especificado, mas os nomes das propriedades são prefixados com 'rótulo'. No segundo, o estilo é criado para objetos de etiqueta.

Outro método para fazer isso é:

<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>

Eu queria aplicar um estilo a um TextBlock e uma caixa de texto, mas a resposta selecionada não trabalho para mim porque textblock não herda de Control, no meu caso eu queria afetar a propriedade de visibilidade, então eu usei 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}"/>

Este obras para a propriedade de visibilidade porque ambos os itens herdam de FrameworkElement ea propriedade é definida lá. Claro que isso não vai funcionar para propriedades definidas apenas no controle, você pode pesquisar a árvore de hierarquia e tentar encontrar uma classe base, de qualquer maneira eu pensei que isso poderia ajudar alguém uma vez que este é um resultado de pesquisa superior e a resposta selecionada é um pouco incompleto.

Há uma resposta alternativa para a questão. Você pode deixar o parâmetro TargetType fora do estilo completamente o que irá permitir que ele se aplica a vários controles diferentes, mas só se você prefixar o nome da propriedade com "Control".

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

Obviamente, isso só funciona para propriedades da classe de controle base. Se você tentou definir ItemsSource dizer, seria um fracasso porque não há Control.ItemsSource

Eu tenho esse trabalho

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top