« Resources » : différence entre les versions

De Banane Atomic
Aller à la navigationAller à la recherche
 
Ligne 55 : Ligne 55 :
     <Application.Resources>
     <Application.Resources>
         <ResourceDictionary>
         <ResourceDictionary>
            <!-- Autres ressources avec leurs clés -->
            <SolidColorBrush Color="#333333" x:Key="myBrush"/>


             <!-- Fusion des fichiers de ressources avec les ressources précédemment déclarées -->
             <!-- Fusion des fichiers de ressources avec les ressources précédemment déclarées -->
Ligne 64 : Ligne 62 :
                 <ResourceDictionary Source="Skins/Icons.xaml" />
                 <ResourceDictionary Source="Skins/Icons.xaml" />
             </ResourceDictionary.MergedDictionaries>
             </ResourceDictionary.MergedDictionaries>
            <!-- Autres ressources avec leurs clés -->
            <SolidColorBrush Color="#333333" x:Key="myBrush"/>
         </ResourceDictionary>
         </ResourceDictionary>
     </Application.Resources>
     </Application.Resources>
</Application>
</Application>
</filebox>
</filebox>
<filebox fn='Skins/MainSkin.xaml' lang='xaml'>
<filebox fn='Skins/MainSkin.xaml' lang='xaml'>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Ligne 74 : Ligne 77 :
</ResourceDictionary>
</ResourceDictionary>
</filebox>
</filebox>
<kode lang='csharp'>
<kode lang='csharp'>
// Dans le code-behind
// Dans le code-behind
Ligne 80 : Ligne 84 :
Application.Current.Resources.MergedDictionaries.Add(rd);
Application.Current.Resources.MergedDictionaries.Add(rd);
</kode>
</kode>
<u>Ordre de recherche des ressources:</u>
<u>Ordre de recherche des ressources:</u>
# Le dictionnaire principal
# Le dictionnaire principal

Dernière version du 19 octobre 2021 à 21:23

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