Dictionnaires de ressources fusionnés

Mise à jour : novembre 2007

Les ressources Windows Presentation Foundation (WPF) prennent en charge la fonctionnalité de dictionnaires de ressources fusionnés. Cette fonctionnalité offre un moyen de définir la partie ressources d'une application WPF en dehors de l'application XAML compilée. Les ressources peuvent ensuite être partagées entre les applications et sont également plus facilement isolées pour la localisation.

Introduction d'un dictionnaire de ressources fusionné

Dans le balisage, la syntaxe suivante permet d'introduire un dictionnaire de ressources fusionné dans une page :

<Page.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="myresourcedictionary.xaml"/>
      <ResourceDictionary Source="myresourcedictionary2.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Page.Resources>

Notez que l'élément ResourceDictionary n'a pas de x:Key, attribut, requis en général pour tous les éléments d'une collection de ressources. Toutefois, une autre référence ResourceDictionary dans la collection MergedDictionaries est un cas particulier, réservé pour ce scénario de dictionnaire de ressources fusionné. Le ResourceDictionary qui introduit un dictionnaire de ressources fusionné ne peut pas avoir de x:Key, attribut. En général, chaque ResourceDictionary dans la collection MergedDictionaries définit un attribut Source. La valeur de Source doit être un URI (Uniform Resource Identifier) qui est résolu en l'emplacement du fichier de ressources à fusionner. La destination de cet URI doit être un autre fichier XAML, avec ResourceDictionary comme élément racine.

Remarque :

Il est permis de définir des ressources dans un ResourceDictionary spécifié en tant que dictionnaire fusionné, soit comme alternative pour spécifier Source, soit en plus des ressources incluses à partir de la source spécifiée. Toutefois, il ne s'agit pas d'un scénario courant ; le scénario principal pour les dictionnaires fusionnés consiste à fusionner des ressources à partir d'emplacements de fichiers externes. Si vous souhaitez spécifier les ressources dans le balisage d'une page, vous devez généralement les définir dans le ResourceDictionary principal et non dans les dictionnaires fusionnés.

Comportement d'un dictionnaire fusionné

Les ressources d'un dictionnaire fusionné se trouvent dans un emplacement de la portée de recherche de ressources, située juste après la portée du dictionnaire de ressources principal dans lequel elles sont fusionnées. Même si un dictionnaire individuel ne doit contenir qu'une seule clé de ressource, un ensemble de dictionnaires fusionnés peut contenir plusieurs fois la même clé. Dans ce cas, la ressource retournée proviendra du dernier dictionnaire trouvé de manière séquentielle dans la collection MergedDictionaries. Si la collection MergedDictionaries a été définie en XAML, l'ordre des dictionnaires fusionnés de la collection correspond à l'ordre des éléments fournis dans le balisage. Si une clé est définie dans le dictionnaire principal et également dans un dictionnaire fusionné, la ressource retournée proviendra donc du dictionnaire principal. Ces règles de portée s'appliquent de la même façon aux références de ressource statique et dynamique.

Dictionnaires fusionnés et code

Les dictionnaires fusionnés peuvent être ajoutés à un dictionnaire Resources à l'aide de code. Par défaut, le ResourceDictionary, vide à l'origine, qui existe pour la propriété Resources a également une propriété de collection MergedDictionaries par défaut, vide à l'origine. Pour ajouter un dictionnaire fusionné à l'aide de code, obtenez une référence au ResourceDictionary principal souhaité, obtenez sa valeur de propriété MergedDictionaries, puis appelez Add sur la Collection générique contenue dans MergedDictionaries. L'objet ajouté doit être un nouveau ResourceDictionary. Dans le code, vous ne définissez pas la propriété Source. À la place, vous devez obtenir un objet ResourceDictionary soit en le créant, soit en le chargeant. L'une des solutions pour charger un ResourceDictionary existant consiste à appeler XamlReader.Load sur un flux de fichier XAML existant disposant d'une racine ResourceDictionary, puis à effectuer un cast de la valeur de retour de XamlReader.Load en ResourceDictionary.

URI de dictionnaire de ressources fusionné

Il existe plusieurs techniques pour inclure un dictionnaire de ressources fusionné, indiquées par le format URI (Uniform Resource Identifier) que vous utiliserez. D'une manière générale, ces techniques peuvent être divisées en deux catégories : les ressources compilées dans le cadre du projet et les ressources qui ne sont pas compilées dans le cadre du projet.

Pour les ressources compilées dans le cadre du projet, vous pouvez utiliser un chemin d'accès relatif qui fait référence à l'emplacement de la ressource. Le chemin d'accès relatif est évalué pendant la compilation. Votre ressource doit être définie dans le cadre du projet comme une action de génération Ressource. Si vous incluez un fichier de ressources .xaml dans le projet en tant que Ressource, vous n'avez pas besoin de copier le fichier de ressources sur le répertoire de sortie car la ressource est déjà incluse dans l'application compilée. Vous pouvez également utiliser l'action de génération Contenu, mais vous devez ensuite copier les fichiers sur le répertoire de sortie et déployer les fichiers de ressources de ce répertoire vers le fichier exécutable.

Remarque :

N'utilisez pas l'action de génération Ressource incorporée. L'action de génération elle-même est prise en charge pour les applications WPF, mais la résolution de Source n'intègre pas ResourceManager et ne peut donc pas séparer la ressource individuelle du flux. Vous pouvez toujours utiliser Ressource incorporée à d'autres fins à condition d'utiliser également ResourceManager pour accéder aux ressources.

Une technique similaire consiste à utiliser un URI à en-tête pack dans un fichier XAML et y faire référence en tant que Source. Un URI à en-tête pack active des références aux composants d'assemblys référencés et d'autres techniques. Pour plus d'informations sur les URI à en-tête pack, consultez Fichiers de ressources, de contenu et de données d'une application Windows Presentation Foundation.

Pour les ressources qui ne sont compilées dans le cadre du projet, l'URI est évalué au moment de l'exécution. Vous pouvez utiliser un transport d'URI courant, tel que file: ou http: pour faire référence au fichier de ressources. L'inconvénient de l'utilisation de l'approche de ressource non compilée est que l'accès file: nécessite d'autres étapes de déploiement et que l'accès http: implique la zone de sécurité Internet.

Réutilisation des dictionnaires fusionnés

Vous pouvez réutiliser ou partager les dictionnaires de ressources entre les applications, car le dictionnaire de ressources à fusionner peut être référencé par un URI (Uniform Resource Identifier) valide. La façon dont vous effectuez cette opération dépend de votre stratégie de déploiement d'application et du modèle d'application suivi. La stratégie d'URI à en-tête pack susmentionnée offre un moyen de se procurer couramment une ressource fusionnée parmi plusieurs projets lors du développement en partageant une référence d'assembly. Dans ce scénario, les ressources sont toujours distribuées par le client et au moins une des applications doit déployer l'assembly référencé. Il est également possible de référencer des ressources fusionnées via un URI distribué qui utilise le protocole http.

L'écriture de dictionnaires fusionnés en tant que fichiers d'application locaux ou sur un espace de stockage partagé local permet également de déployer des dictionnaires ou des applications.

Localisation

Si les ressources à localiser sont isolées dans des dictionnaires qui sont fusionnés dans des dictionnaires primaires et si elles sont conservées en tant que XAML libre, ces fichiers peuvent être localisés séparément. Cette technique est une alternative légère à la localisation des assemblys de ressources satellites. Pour plus d'informations, consultez Vue d'ensemble de la globalisation et de la localisation WPF.

Voir aussi

Concepts

Vue d'ensemble des ressources

Ressources et code

Fichiers de ressources, de contenu et de données d'une application Windows Presentation Foundation

Référence

ResourceDictionary