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 également plus facilement isolées pour la localisation.
Présentation d’un dictionnaire de ressources fusionné
Dans le balisage, vous utilisez la syntaxe suivante pour 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 nécessaire pour tous les éléments d’une collection de ressources. Mais une autre référence ResourceDictionary dans la collection MergedDictionaries est un cas spécial, réservé à ce scénario de dictionnaire de ressources fusionné. Le ResourceDictionary qui introduit un dictionnaire de ressources fusionnées ne peut pas avoir de directive x :Key. En règle générale, chaque ResourceDictionary dans la collection MergedDictionaries spécifie un attribut Source. 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.
Note
Il est légal de définir des ressources dans une ResourceDictionary spécifiée en tant que dictionnaire fusionné, soit comme alternative à la spécification de Source, soit en plus des ressources incluses à partir de la source spécifiée. Toutefois, ce n’est pas 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 la ResourceDictionary principale et non dans les dictionnaires fusionnés.
Comportement du dictionnaire fusionné
Les ressources d’un dictionnaire fusionné occupent un emplacement dans l’étendue de recherche de ressources qui se trouve juste après l’étendue du dictionnaire de ressources principal dans laquelle elles sont fusionnées. Bien qu’une clé de ressource soit unique dans n’importe quel dictionnaire individuel, une clé peut exister plusieurs fois dans un ensemble de dictionnaires fusionnés. Dans ce cas, la ressource retournée provient du dernier dictionnaire trouvé séquentiellement dans la collection MergedDictionaries. Si la collection MergedDictionaries 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 dans le dictionnaire principal et dans un dictionnaire qui a été fusionné, la ressource retournée provient du dictionnaire principal. Ces règles d’étendue s’appliquent également aux références de ressources statiques et aux références de ressources dynamiques.
Dictionnaires fusionnés et code
Vous pouvez ajouter des dictionnaires fusionnés à un dictionnaire Resources
par le biais du code. La valeur par défaut ResourceDictionary, initialement vide, qui existe pour n'importe quelle propriété Resources
, a également une propriété de collection MergedDictionaries, initialement vide par défaut. Pour ajouter un dictionnaire fusionné via du code, commencez par obtenir une référence au ResourceDictionaryprincipal souhaité, puis obtenez la valeur de sa propriété MergedDictionaries, et enfin, appelez Add
sur le Collection
générique contenu dans MergedDictionaries. L’objet que vous ajoutez doit être une nouvelle ResourceDictionary. Dans le code, vous ne définissez pas la propriété Source. Au lieu de cela, vous devez obtenir un objet ResourceDictionary en créant un ou en chargeant un. Une façon de charger un ResourceDictionary existant consiste à appeler XamlReader.Load sur un flux de fichiers XAML existant qui a une racine ResourceDictionary, puis à caster la valeur de retour XamlReader.Load en 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. En général, 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 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 en tant qu’action de génération de ressource. Si vous incluez un fichier .xaml de ressource dans le projet en tant que ressource, vous n’avez pas besoin de copier le fichier de ressources dans le répertoire de sortie, la ressource est déjà incluse dans l’application compilée. Vous pouvez également utiliser l’action de génération de contenu, mais vous devez ensuite copier les fichiers dans le répertoire de sortie et déployer les fichiers de ressources dans la même relation de chemin d’accès vers l’exécutable.
Note
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 n’incorpore pas 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. L’URI pack permet le référencement des composants des assemblies référencés et à d'autres techniques. Pour plus d’informations sur les Pack URIs, consultez Ressources, contenus et fichiers de données pour les applications 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 le fichier : 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 au fichier nécessite des étapes de déploiement supplémentaires, et l'accès au 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 façon dont vous procédez dépend exactement de votre stratégie de déploiement d’application et du modèle d’application que vous suivez. La stratégie d’URI Pack mentionnée ci-dessus permet de sourcer généralement une ressource fusionnée sur 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 é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 dans un stockage partagé local est un autre scénario de déploiement de dictionnaire/d’application fusionné possible.
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 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
.NET Desktop feedback