61 votes

Peut-on définir plusieurs TargetTypes pour un style XAML ?

En HTML/CSS, vous pouvez définir un style qui peut ê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 dans 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 de permettre à un style XAML d'être appliqué à plusieurs éléments ou même de le laisser ouvert comme en CSS ?

70voto

Josh G Points 7547

Les setters des styles WPF sont vérifiés au moment de la compilation ; les styles CSS sont appliqués dynamiquement.

Vous devez spécifier un type pour que WPF puisse résoudre les propriétés dans les setters aux propriétés de dépendance de ce type.

Vous pouvez définir le type cible sur les classes de base qui contiennent les propriétés que vous souhaitez, puis appliquer ce style aux classes dérivées. Par exemple, vous pouvez créer un style pour les objets Control, puis l'appliquer à plusieurs types de contrôles (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"/>

38voto

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 d'un style peuvent répondre à votre question. Dans la première, aucun TargetType n'est spécifié, mais les noms des propriétés sont préfixés par "Label". Dans la seconde, 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 autre réponse à cette question. Vous pouvez ne pas tenir compte du paramètre TargetType dans le style, ce qui lui permettra de s'appliquer à différents contrôles, mais uniquement si vous préfixez le nom de la propriété par "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, cela échouera car il n'existe pas de Control.ItemsSource.

-2voto

Avlin Points 193

J'ai réussi à faire fonctionner ceci

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

X