58 votes

Pouvez-vous définir plusieurs TargetTypes pour un style XAML?

En HTML / CSS, vous pouvez définir un style pouvant être appliqué à de nombreux types d'éléments, par exemple:

 .highlight {
    color:red;
}
 

peut être appliqué à la fois à P et à DIV, par exemple:

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

mais en XAML, il semble que vous deviez définir le TargetType pour les styles, sinon vous obtenez une erreur:

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

Existe-t-il un moyen d'autoriser l'application d'un style XAML à plusieurs éléments ou même de le laisser ouvert comme dans CSS?

68voto

Josh G Points 7547

Les organismes de normalisation WPF styles sont vérifiées lors de la compilation; styles CSS sont appliquées de façon dynamique.

Vous devez spécifier un type de sorte que WPF peut résoudre les propriétés dans les organismes de normalisation pour la dépendance des propriétés de ce type.

Vous pouvez définir le type de cible à des classes de base qui contiennent les propriétés que vous voulez et ensuite appliquer ce style aux classes dérivées. Par exemple, vous pouvez créer un style pour le Contrôle des objets et de les appliquer à plusieurs types de contrôles (Bouton, zone de texte, Case à cocher, 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"/>

36voto

Gaurang Points 198
 <!-- 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>
 

Je pense que ces deux méthodes de déclaration de style pourraient répondre à votre question. Dans le premier, aucun type de cible n'est spécifié, mais les noms de propriété portent le préfixe 'Label'. Dans le second, le style est créé pour les objets Label.

Une autre méthode pour le faire est:

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

3voto

PaulMolloy Points 189

Il existe une réponse alternative à la question. Vous POUVEZ laisser le paramètre TargetType complètement hors du style, ce qui lui permettra de s’appliquer à divers contrôles différents, mais uniquement si vous préfixez le nom de la propriété avec «Control».

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

Évidemment, cela ne fonctionne que pour les propriétés de la classe de contrôle de base. Si vous essayez de définir ItemsSource par exemple, cela échouera car il n'y a pas de Control.ItemsSource.

-2voto

Avlin Points 193

J'ai ce travail

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: