Question

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 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 d'autoriser l'application d'un style XAML à plusieurs éléments ou même de le laisser ouvert comme dans CSS?

Était-ce utile?

La solution

Les paramètres dans les styles WPF sont vérifiés pendant 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 des setters en propriétés de dépendance de ce type.

Vous pouvez définir le type de cible sur les classes de base contenant les propriétés souhaitées, puis appliquer ce style aux classes dérivées. Par exemple, vous pouvez créer un style pour les objets de contrôle, 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"/>

Autres conseils

<!-- 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 consiste à:

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

Je voulais appliquer un style à un bloc de texte et à une zone de texte, mais la réponse sélectionnée ne fonctionnait pas pour moi, car Textblock n'hérite pas de Control. Dans mon cas, je souhaitais affecter la propriété Visibility. J'ai donc utilisé 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}"/>

Ceci fonctionne pour la propriété Visibility car les deux éléments héritent de Frameworkelement et la propriété y est définie. Bien sûr, cela ne fonctionnera pas pour les propriétés définies uniquement dans Control, vous pouvez effectuer une recherche dans l'arborescence de la hiérarchie et essayer de trouver une classe de base. Quoi qu'il en soit, j'ai pensé que cela pourrait aider quelqu'un car il s'agit d'un résultat de recherche supérieur et la réponse sélectionnée est un peu incomplète.

Il existe une réponse alternative à la question. Vous POUVEZ laisser le paramètre TargetType hors du style, ce qui lui permettra de s’appliquer à différents contrôles, mais uniquement si vous préfixez le nom de la propriété avec le mot-clé "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

.

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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top