Dictionnaires de ressources fusionnés (WPF .NET)

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.

Important

La documentation du Guide du bureau pour .NET 7 et .NET 6 est en cours de construction.

Créer un dictionnaire 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>

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é. De plus, le ResourceDictionary dictionnaire de ressources fusionné n’a pas 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. 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, définissez-les dans les dictionnaires principaux ResourceDictionary 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 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 dans le dictionnaire principal et dans un dictionnaire qui a été 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 valeur de retour sur ResourceDictionary.

URI de dictionnaire 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 utilisez. 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 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 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.

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. L’URI pack permet des références aux composants d’assemblys référencés et d’autres techniques. Pour plus d’informations sur les URI pack, consultez la ressource d’application WPF, le contenu et les fichiers de données.

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 le fichier : l’accès nécessite des étapes de déploiement supplémentaires, et http : l’accès 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 précédemment 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 et d’application fusionnés.

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