Partager via


Dictionnaires de ressources fusionnés

Les ressources WPF (Windows Presentation Foundation) prennent en charge une fonctionnalité de dictionnaire de ressources fusionnée. Cette fonctionnalité permet 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 aussi isolées plus facilement 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 directive x :Key, qui est généralement requise pour tous les éléments d’une collection de ressources. Mais une autre ResourceDictionary référence dans la MergedDictionaries collection est un cas spécial, réservée à ce scénario de dictionnaire de ressources fusionné. Celui ResourceDictionary qui introduit un dictionnaire de ressources fusionné ne peut pas avoir de directive x :Key. En règle générale, chaque ResourceDictionary élément de la MergedDictionaries collection spécifie un Source attribut. La valeur de Source doit être un URI (Uniform Resource Identifier) qui se résout à 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 légal de définir des ressources au sein d’un ResourceDictionary dictionnaire fusionné, soit comme alternative à la spécification Source, soit en plus des ressources incluses à partir de la source spécifiée. Cependant, 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 des ressources dans le balisage d’une page, vous devez généralement les définir dans les dictionnaires principaux ResourceDictionary et non dans les dictionnaires fusionnés.

Comportement d’un dictionnaire fusionné

Les ressources d’un dictionnaire fusionné occupent un emplacement dans la portée de recherche des ressources, qui se trouve 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 provient du dernier dictionnaire trouvé séquentiellement dans la MergedDictionaries collection. Si la MergedDictionaries collection a été définie en XAML, l’ordre des dictionnaires fusionnés dans la collection est l’ordre des éléments fournis dans le balisage. Si une clé est définie à la fois dans le dictionnaire principal et dans un dictionnaire fusionné, la ressource retournée provient du dictionnaire principal. Ces règles de portée s’appliquent de la même façon aux références de ressources statiques et aux références de ressources dynamiques.

Dictionnaires fusionnés et code

Il est possible d’ajouter des dictionnaires fusionnés à un dictionnaire Resources avec du code. La valeur par défaut, initialement vide ResourceDictionary qui existe pour n’importe quelle Resources propriété a également une propriété de collection par défaut, initialement vide MergedDictionaries . Pour ajouter un dictionnaire fusionné via du code, vous obtenez une référence au principal ResourceDictionarysouhaité, obtenez sa MergedDictionaries valeur de propriété et appelez Add le générique Collection contenu dans MergedDictionaries. L’objet que vous ajoutez doit être un nouvel ResourceDictionaryobjet . Dans le code, vous ne définissez pas la Source propriété. Au lieu de cela, vous devez obtenir un ResourceDictionary objet en créant un ou en chargeant un. Une façon de charger un existant pour appeler XamlReader.Load sur un flux de fichiers XAML existant ResourceDictionary qui a une ResourceDictionary racine, puis de castr la XamlReader.Load valeur de retour sur ResourceDictionary.

URI de dictionnaire de ressources fusionné

Il existe plusieurs techniques pour inclure un dictionnaire de ressources fusionné, qui sont indiqués par le format URI (Uniform Resource Identifier) que vous utiliserez. Pour simplifier, ces techniques peuvent être divisées en deux catégories : les ressources qui sont compilés dans le cadre du projet et celles qui ne le sont pas.

Pour les ressources qui sont compilés dans le cadre du projet, vous pouvez utiliser un chemin relatif qui fait référence à l’emplacement de la ressource. Le chemin relatif est évalué pendant la compilation. Votre ressource doit être définie dans le cadre du projet comme une action de génération de ressources. 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 dans le répertoire de sortie, car la ressource est déjà incluse dans l’application compilée. Vous pouvez aussi utiliser l’action de génération de contenu, mais vous devez dans ce cas copier les fichiers dans le répertoire de sortie et déployer aussi les fichiers de ressources de ce répertoire vers le fichier exécutable.

Remarque

N’utilisez pas l’action de génération de 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 ne pas incorporer ResourceManager, et ne peut donc pas séparer la ressource individuelle du flux. Vous pouvez toujours utiliser la ressource incorporée à d’autres fins tant que vous avez également utilisé ResourceManager pour accéder aux ressources.

Une technique associée consiste à utiliser un URI Pack pour un fichier XAML et à lui faire référence en tant que source. Un URI à en-tête pack active les références aux composants des 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 WPF.

Pour les ressources qui ne sont pas 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 d’une utilisation de l’approche de ressource non compilée est que l’accès file: nécessite des étapes de déploiement supplémentaires, et l’accès http: implique la zone de sécurité Internet.

Réutilisation des dictionnaires fusionnés

Vous pouvez réutiliser ou partager des dictionnaires de ressources fusionnés entre des applications, car le dictionnaire de ressources à fusionner peut être référencé via n’importe quel URI (Uniform Resource Identifier) valide. La procédure exacte à suivre dans ce cas 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 mentionnée plus haut offre un moyen de se procurer communément une ressource fusionnée parmi plusieurs projets pendant le 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 l’une des applications doit déployer l’assembly référencé. Il est aussi 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 dans un espace de stockage partagé local est un autre scénario possible de déploiement de dictionnaires fusionnés ou d’applications.

Localisation

Si les ressources qui doivent être localisées sont isolées dans des dictionnaires fusionnés dans des dictionnaires principaux et conservés en XAML libre, ces fichiers peuvent être localisés séparément. Cette technique est une solution de rechange simplifiée de 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