Resources

De Banane Atomic
Révision datée du 19 octobre 2021 à 21:23 par Nicolas (discussion | contributions) (→‎Merge dictionaries)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigationAller à la recherche

Exemples

Réutiliser un ToolTip définit dans les ressources

Xaml.svg
<Window.Resources>
    <ToolTip x:Key="MyToolTip" Content="contenu du tooltip" />
</Window.Resources>

<TextBox ToolTip="{StaticResource MyToolTip}" />
<Label ToolTip="{StaticResource ResourceKey=MyToolTip}" />

Modifier une ressource

Xaml.svg
<Window.Resources>
    <SolidColorBrush x:Key="tbBrush" Color="Red"></SolidColorBrush>
</Window.Resources>

<TextBlock Foreground="{DynamicResource tbBrush}">Hello!</TextBlock>
Csharp.svg
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.
Csharp.svg
// 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

Csharp.svg
// équivalent de Foreground="{DynamicResource clé}
myTextBlock.SetResourceReference(ForegroundProperty, "clé");

Pack URI

Spécifie le chemin où trouver le fichier contenant les ressources.

Xaml.svg
<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>
Csharp.svg
// 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:

  1. Le dictionnaire principal
  2. 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

Csharp.svg
// 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:

  1. dictionnaire de ressources de l'objet appelant FindResource ou TryFindResource
  2. dictionnaire de ressources de son conteneur et ainsi de suite jusqu'au conteneur principale
  3. dictionnaire de ressources de l'objet Application
  4. dictionnaire associé aux thèmes Windows
  5. ressources représentant les objets du système