La structure interne ainsi que le design d'AreaProg ont récemment été modifiés.
Suite à cela, le format de certains articles a été perturbé. Le problème est connu et en cours de résolution. Merci de votre compréhension.
<StackPanel.Resources> <SolidColorBrush x:Key="myColor" Color="Gold" /> </StackPanel.Resources>Voilà, nous déclarons bien un objet de type SolidColorBrush et définissons sa couleur (Or ici) via sa propriété Color. La propriété Key est spécifique aux ressources, c’est la propriété qui va permettre de sélectionner la ressource pour l’utiliser. Pourquoi ne pas utiliser la propriété Name ? et bien tout simplement car Name correspond au nom de l’instance de l’objet et non à un mot clef à utiliser pour retrouver une ressource. La propriété Key peut ne pas être unique dans l’application, mais doit l’être dans la section ressources dans laquelle elle est déclarée. Petite précision, vous pouvez déclarer les ressources dans n’importe quel élément WPF suivant les éléments devant l’utiliser. Par exemple, si dans ce cas ci, vous voulez rendre la ressource disponible à tous les éléments de la fenêtre, vous devriez alors la déclarer dans la section Resources de la fenêtre comme ceci :
<Window.Resources> <SolidColorBrush x:Key="myColor" Color="Gold" /> </Window.Resources>Maintenant, comment utiliser notre ressource ? Voici le code complet :
<Window x:Class="coursWPF.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Cours WPF" Height="114" Width="400" Loaded="Window_Loaded">
<StackPanel>
<StackPanel.Resources>
<SolidColorBrush x:Key="myColor" Color="Gold" />
</StackPanel.Resources>
<Button x:Name="bt1"
Background="{StaticResource myColor}"
Content="Test"
/>
<Label Content="Jolie couleur n'est-il pas ?"
Background="{StaticResource myColor}"
/>
</StackPanel>
</Window>
Ce qui affiche :
On accède à la ressource dans ce cas via StaticResource et la clé myColor. Vous verrez aussi qu'il existe la balise DynamicResource. Nous verrons plus loin la différent.
Avant tout il est important de spécifier que lorsqu’un objet doit utiliser une ressource, il va dabord chercher si la clé est présente dans la section ressource de son élément. Si ce n’est pas le cas, il remonte la hiérarchie parentale du visualTree (Button, StackPanel, Windows, Application par exemple).
<Application x:Class="coursWPF.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Window1.xaml"> <Application.Resources> <SolidColorBrush x:Key="appRes" Color="Gold" /> </Application.Resources> </Application>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <SolidColorBrush x:Key="myColor2" Color="Aqua" /> </ResourceDictionary>
<Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="myDictionary.xaml"/> </ResourceDictionary.MergedDictionaries> <SolidColorBrush x:Key="myColor" Color="Gold" /> </ResourceDictionary> </Window.Resources>Remarquez ici où j’ai placé la ressource précédemment créée. Lorsque vous voulez ajouter des ressources à la section resources contenant un dictionnaire , c’est là qu’il faut la placer. Pour accéder à une ressource d’un dictionnaire, rien ne change, par exemple ici on peut faire :
<Label Content="Jolie couleur n'est-il pas ?"
Background="{StaticResource myColor2}"
/>
SolidColorBrush brush = null;
brush = (SolidColorBrush)stack1.FindResource("myColor");
La méthode FindResource lance une exception si la ressource n’a pas été trouvée.
Il est possible d’accéder à une ressource directement sans passer par la fonction FindResources. Voici comment :
brush = (SolidColorBrush)stack1.Resources["myColor"];L’accès aux ressources étant Read-Write (lecture, écriture), vous pouvez aussi les modifier. Ceci clot notre chapitre sur les ressources. Place maintenant aux styles.
<Setter Property="Button.Background" Value="Gold" />Property contient la propriété à modifier, dans ce cas ci nous devons spécifier le type du control qui sera modifié. Pour permettre à ce style d'être appliqué à plusieurs types de contrôles, nous utiliserons la classe de base des controles en faisant comme ceci : Control.Background. Value contient la valeur à affecter à la propriété.
<EventSetter Event="Button.Click" Handler="bt1_Click" />
<Window x:Class="coursWPF.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Cours WPF" Height="114" Width="400" Loaded="Window_Loaded"> <StackPanel x:Name="stack1"> <Button x:Name="bt1" Content="Test" > <Button.Style> <Style> <Setter Property="Button.Background" Value="Gold" /> <EventSetter Event="Button.Click" Handler="bt1_Click" /> </Style> </Button.Style> </Button> </StackPanel> </Window>Ce qui exécute : Voyons maintenant comment faire au niveau d’un style mis en ressource. Une ressource peut être de n’importe quel type, donc faisons simplement comme nous l’avons appris plus tôt dans ce cours :
<Window x:Class="coursWPF.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Cours WPF" Height="114" Width="400" Loaded="Window_Loaded">
<Window.Resources>
<Style x:Key="myStyle">
<Setter Property="Button.Background" Value="Gold" />
<EventSetter Event="Button.Click" Handler="bt1_Click" />
</Style>
</Window.Resources>
<StackPanel x:Name="stack1">
<Button x:Name="bt1"
Content="Test"
Style="{StaticResource myStyle}"
>
</Button>
</StackPanel>
</Window>
Et voilà, le tour est joué.
<Window x:Class="coursWPF.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Cours WPF" Height="114" Width="400" Loaded="Window_Loaded"> <Window.Resources> <Style TargetType="Button"> <Setter Property="Background" Value="Gold" /> <EventSetter Event="Click" Handler="bt1_Click" /> </Style> </Window.Resources> <StackPanel x:Name="stack1"> <Button x:Name="bt1" Content="Test" /> <Button x:Name="bt2" Content="Test 2" /> </StackPanel> </Window>Attention, n’oubliez pas de ne pas mettre de propriété Key, sinon cela ne fonctionne pas. Voici le résultat : Si vous voulez qu’un bouton n’applique pas ce style, donnez la valeur {x :Null} à la propriété Style.
<Window x:Class="coursWPF.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Cours WPF" Height="114" Width="400" Loaded="Window_Loaded">
<Window.Resources>
<Style x:Key="myStyleParent">
<Setter Property="Button.Background" Value="Gold" />
<EventSetter Event="Button.Click" Handler="bt1_Click" />
</Style>
<Style x:Key="myStyleChild" BasedOn="{StaticResource myStyleParent}">
<Setter Property="Button.Foreground" Value="Blue"/>
<Setter Property="Button.FontSize" Value="15" />
</Style>
</Window.Resources>
<StackPanel x:Name="stack1">
<Button x:Name="bt1"
Content="Test"
Style="{StaticResource myStyleParent}"
/>
<Button x:Name="bt2"
Content="Test 2"
Style="{StaticResource myStyleChild}"
/>
</StackPanel>
</Window>
Ce qui donne :
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Style myStyle3 = newStyle();
Setter setter = newSetter();
setter.Property = Button.BackgroundProperty;
setter.Value = Brushes.Gold;
myStyle3.Setters.Add(setter);
bt1.Style = myStyle3;
}
Voilà je pense le tout assez clair. A bientôt dans un nouveau cours :-). Veuillez vous identifier ou vous inscrire pour donner une note à cet article.
Aucun commentaire.
Veuillez vous identifier ou vous inscrire pour réagir à cet article.