« Resources » : différence entre les versions

De Banane Atomic
Aller à la navigationAller à la recherche
 
Ligne 87 : Ligne 87 :
{{info | Les clés doivent être uniques au sein d'un dictionnaire, mais peuvent exister dans différents dictionnaires agrégés.}}
{{info | Les clés doivent être uniques au sein d'un dictionnaire, mais peuvent exister dans différents dictionnaires agrégés.}}


= Chercher une ressource depuis le code-behind =
= Récupérer une ressource depuis le code-behind =
<kode lang='csharp'>
<kode lang='csharp'>
// génère une ResourceReferenceKeyNotFoundException si la ressource n'est pas trouvée
// génère une ResourceReferenceKeyNotFoundException si la ressource n'est pas trouvée
Ligne 99 : Ligne 99 :
Style monStyle = (Style)Application.Current.Resources["clé"];  // l'objet Application
Style monStyle = (Style)Application.Current.Resources["clé"];  // l'objet Application
Style monStyle = (Style)this.Resources["clé"];  // l'objet courant
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"]
</kode>
</kode>
<u>Ordre de recherche:</u>
<u>Ordre de recherche:</u>
# dictionnaire de ressources de l'objet appelant {{boxx|FindResource}} ou {{boxx|TryFindResource}}
# dictionnaire de ressources de l'objet appelant {{boxx|FindResource}} ou {{boxx|TryFindResource}}

Version du 9 juin 2021 à 16:01

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>
            <!-- 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 -->
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Skins/MainSkin.xaml" />
                <!-- Icônes SVG au format XAML -->
                <ResourceDictionary Source="Skins/Icons.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </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