Resources
Apparence
Exemples
Réutiliser un ToolTip définit dans les ressources
<Window.Resources>
<ToolTip x:Key="MyToolTip" Content="contenu du tooltip" />
</Window.Resources>
<TextBox ToolTip="{StaticResource MyToolTip}" />
<Label ToolTip="{StaticResource ResourceKey=MyToolTip}" />
|
Modifier une ressource
<Window.Resources>
<SolidColorBrush x:Key="tbBrush" Color="Red"></SolidColorBrush>
</Window.Resources>
<TextBlock Foreground="{DynamicResource tbBrush}">Hello!</TextBlock>
|
this.Resources["tbBrush"] = new SolidColorBrush(Colors.Blue);
|
StaticResource vs DynamicResource
StaticResource | La ressource est recherché lors du chargement du fichier XAML. La ressource doit être déclarée avant son utilisation. |
DynamicResource | Évaluée lors de chaque utilisation de la ressource. |
// remplacement d'une ressource (brush) par une autre
// StaticResource: l'ancienne couleur est toujours utilisée
// DynamicResource: la nouvelle couleur est bien utilisée
Application.Current.Resources["clé"] = new SolidColorBrush(Colors.Blue);
|
Créer une liaison DynamicResource dans le code behind
// équivalent de Foreground="{DynamicResource clé}
myTextBlock.SetResourceReference(ForegroundProperty, "clé");
|
Pack URI
Spécifie le chemin où trouver le fichier contenant les ressources.
<ResourceDictionary Source="pack://application:,,,/Nom.de.lAssemblage;component/Dossier/Fichier.xaml" />
|
Merge dictionaries
Permet de fusionner plusieurs fichiers de ressources.
App.xaml |
<Application>
<Application.Resources>
<ResourceDictionary>
<!-- Fusion des fichiers de ressources avec les ressources précédemment déclarées -->
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Skins/MainSkin.xaml" />
<!-- Icônes SVG au format XAML -->
<ResourceDictionary Source="Skins/Icons.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- Autres ressources avec leurs clés -->
<SolidColorBrush Color="#333333" x:Key="myBrush"/>
</ResourceDictionary>
</Application.Resources>
</Application>
|
Skins/MainSkin.xaml |
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- Ressources avec leurs clés -->
</ResourceDictionary>
|
// Dans le code-behind
var rd = new ResourceDictionary();
rd.Source = new Uri("Skins/MainSkin.xaml", UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Add(rd);
|
Ordre de recherche des ressources:
- Le dictionnaire principal
- Les dictionnaires agrégés
- dans l'ordre de leur déclaration XAML
- dans l'ordre inverse de leur ajout dans le code-behind (le dernier ajouté est le premier parcourut)
![]() |
Les clés doivent être uniques au sein d'un dictionnaire, mais peuvent exister dans différents dictionnaires agrégés. |
Récupérer une ressource depuis le code-behind
// génère une ResourceReferenceKeyNotFoundException si la ressource n'est pas trouvée
Style monStyle = (Style)this.FindResource("clé");
// pas d'exception si la ressource n'est pas trouvée
Style monStyle = (Style)this.TryFindResource("clé");
// recherche exclusivement dans un dictionnaire de ressources donné
// pas d'exception si la ressource n'est pas trouvée
Style monStyle = (Style)Application.Current.Resources["clé"]; // l'objet Application
Style monStyle = (Style)this.Resources["clé"]; // l'objet courant
// get style from a nuget library
ResourceDictionary ExternalLibResourceDictionary = new ResourceDictionary
{
Source = new Uri("/My.Namespace;component/MyResource.xaml", UriKind.RelativeOrAbsolute)
};
Style myStyle = (Style)ExternalLibResourceDictionary["ResourceKey"]
|
Ordre de recherche:
- dictionnaire de ressources de l'objet appelant FindResource ou TryFindResource
- dictionnaire de ressources de son conteneur et ainsi de suite jusqu'au conteneur principale
- dictionnaire de ressources de l'objet Application
- dictionnaire associé aux thèmes Windows
- ressources représentant les objets du système