Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. WPF
  3. Ressources, styles, thèmes et Triggers
Extrait - WPF Développez des applications structurées (MVVM, XAML...) (Nouvelle édition)
Extraits du livre
WPF Développez des applications structurées (MVVM, XAML...) (Nouvelle édition) Revenir à la page d'achat du livre

Ressources, styles, thèmes et Triggers

Introduction

Le présent chapitre est consacré à des mécanismes de WPF qui utilisent parfois eux-mêmes le binding et qui complètent l’offre exhaustive de définition d’un client lourd. Il s’agit des ressources, des styles, des thèmes (sorte de collection de styles) ainsi que des triggers WPF qui permettent de rendre souples les déclenchements de diverses fonctionnalités.

Ressources

1. Introduction

En quelques mots, une ressource (objet Resource) correspond au stockage de données utilisées ou non dans l’application. Ces données sont associées soit à toute l’application, soit à toute une fenêtre, soit même à un contrôle donné. Le concept de ressources est particulièrement utilisé par les Styles et les Templates (modèles) également étudiés dans ce chapitre. Il n’y a pas de réelles restrictions quant à la nature des données qui seront factorisées, car c’est en effet l’un des atouts de ce mécanisme : la factorisation. Par ailleurs, une ressource est stockée dans un conteneur de type ResourceDictionary. Toutefois, il n’est pas forcément nécessaire de se référer explicitement à ce ResourceDictionary dès l’instant que l’on utilise la clé de la ressource (attribut x:Key).

Si on prend un premier exemple qui consiste à factoriser dans les ressources une simple chaîne de caractères (« Monsieur Marcel Tournevis ») utilisée plusieurs fois dans une fenêtre.

images/07EI01.png

Comme on peut le voir, la chaîne de caractères apparaît deux fois dans le texte.

Au sein du code XAML, la ressource est définie ainsi :


    <Window.Resources> 
        <system:String x:Key="MAT">Monsieur Marcel Tournevis 
</system:String> 
    </Window.Resources>
 

Et ses utilisations le sont comme cela :


<TextBlock Text="{StaticResource MAT}" />
 

MainWindow.xaml :


<Window x:Class="CH7_EX1.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/ 
presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/ 
markup-compatibility/2006" 
        xmlns:local="clr-namespace:CH7_EX1" 
        mc:Ignorable="d" 
        xmlns:system="clr-namespace:System;assembly=mscorlib" ...

Styles

Les styles représentent un outil extrêmement puissant de WPF. Stockés dans les ressources (Resources), ils permettent d’associer des familles de valeurs de propriétés à des objets WPF. Pour cela, on utilise la classe Setter. De façon assez similaire, il existe une façon de faire l’équivalent avec les événements, ceci grâce à la classe EventSetter.

1. Premiers éléments de syntaxe

Selon un schéma clé-valeur, l’utilisation de Setter, qui associe le nom d’une propriété et sa valeur, est la suivante :


            <Setter Property="Width" Value="25" />
 

On précise le type éligible en utilisant la propriété TargetType.


    <Window.Resources> 
        <Style TargetType="TextBox" x:Key="MonStyle"> 
            <Setter Property="Width" Value="25" /> 
            <Setter Property="Height" Value="250" /> 
            <Setter Property="BorderThickness" Value="1" /> 
            <Setter Property="Foreground" Value="Red" /> 
        </Style> 
    </Window.Resources>
 

On peut également cibler une instance de contrôle particulière par son nom (et non donc par son type) en utilisant TargetName :


<Window.Resources> 
        <Style TargetName="MaZoneDeTexte"> 
            <Setter Property="Width" Value="250" /> 
            <Setter Property="Height" Value="18" /> 
            <Setter Property="BorderThickness" Value="1" /> 
            <Setter Property="Foreground" Value="Red" /> 
        </Style> 
    </Window.Resources>
 

Si un Style utilise TargetType sans toutefois préciser une clé x:Key alors le Style sera appliqué...

Thèmes

Schématiquement, on peut considérer un thème comme étant un ensemble de styles qui s’applique à toute une application. Ainsi, on peut facilement imposer une ligne graphique cohérente à tout un applicatif : des boutons tous de même type, une gamme de couleurs cohérente, etc.

Par défaut, le thème appliqué est un thème Windows défini dans un fichier nommé Generic.xaml. Si vous utilisez Visual Studio de Microsoft, un certain nombre d’autres thèmes sont disponibles. Il est possible également d’en télécharger (gratuits ou non), le développement total d’un thème consistant en une tâche graphique particulièrement longue et difficile.

Dans le cas de l’utilisation d’un thème supplémentaire, il s’agit de l’ajouter dans un dictionnaire de ressources :


<ResourceDictionary> 
  <ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="/MesThemes;component/themes/ 
MonTheme.xaml" /> 
  </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary>
 

Le thème est ensuite appliqué au niveau de l’application, d’une fenêtre, voire uniquement d’un contrôle en y faisant référence via une balise Style :


Style="{StaticResource...

Triggers

Par Trigger, on entend « déclenchement », c’est-à-dire qu’une valorisation d’une ou plusieurs propriétés se fait conditionnellement, par déclenchement sur un Trigger. On peut définir des Triggers sur des propriétés, sur des données et sur des événements. Ce mécanisme utilise largement l’objet Style vu précédemment.

1. Trigger de propriétés

Ce type de Trigger « observe » la ou les valeurs de propriétés. Selon les valeurs atteintes, le Trigger se déclenche et la valeur d’autres propriétés (d’un autre contrôle par exemple) change.

Exemple : dans la situation suivante, quand le contrôle est survolé (c’est-à-dire IsMouseOver est égal à True), le texte inclus est souligné et mis en italique.


<Window x:Class="CH7___PROPERTY_TRIGGER.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/ 
presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/ 
markup-compatibility/2006" 
        xmlns:local="clr-namespace:CH7___PROPERTY_TRIGGER" 
        mc:Ignorable="d" 
        Title="CH7 - PROPERTY TRIGGER" Height="150" Width="350"> 
    <StackPanel Margin="15"> 
        <TextBlock Text="Ceci est un Test"  
                   FontSize="25"  
                   FontWeight="Bold" 
                   HorizontalAlignment="Center"> 
            <TextBlock.Style> 
                <Style TargetType="TextBlock"> 
                    <Style.Triggers> 
  ...