Dictionnaires de ressources fusionnésMerged Resource Dictionaries

Les ressources Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) prennent en charge une fonctionnalité de dictionnaire de ressources fusionné.Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) resources support a merged resource dictionary feature. Cette fonctionnalité offre un moyen de définir la partie ressources d’une application WPFWPF en dehors de l’application XAMLXAML compilée.This feature provides a way to define the resources portion of a WPFWPF application outside of the compiled XAMLXAML application. Les ressources peuvent ensuite être partagées entre les applications et sont aussi isolées plus facilement pour la localisation.Resources can then be shared across applications and are also more conveniently isolated for localization.

Introduction d’un dictionnaire de ressources fusionnéIntroducing a Merged Resource Dictionary

Dans le balisage, la syntaxe suivante permet d’introduire un dictionnaire de ressources fusionné dans une page :In markup, you use the following syntax to introduce a merged resource dictionary into a 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.Note that the ResourceDictionary element does not have an x:Key Directive, which is generally required for all items in a resource collection. Toutefois, une autre ResourceDictionary référence dans la collection de MergedDictionaries est un cas spécial, réservé à ce scénario de dictionnaire de ressources fusionné.But another ResourceDictionary reference within the MergedDictionaries collection is a special case, reserved for this merged resource dictionary scenario. La ResourceDictionary qui introduit un dictionnaire de ressources fusionné ne peut pas avoir de directive x :Key.The ResourceDictionary that introduces a merged resource dictionary cannot have an x:Key Directive. En règle générale, chaque ResourceDictionary dans la collection de MergedDictionaries spécifie un attribut Source.Typically, each ResourceDictionary within the MergedDictionaries collection specifies a Source attribute. La valeur de Source doit être un URI (Uniform Resource Identifier) qui correspond à l’emplacement du fichier de ressources à fusionner.The value of Source should be a uniform resource identifier (URI) that resolves to the location of the resources file to be merged. La destination de cet URI doit être un autre fichier de XAMLXAML, avec ResourceDictionary comme élément racine.The destination of that URI must be another XAMLXAML file, with ResourceDictionary as its root element.

Notes

Il est légal de définir des ressources au sein d’un ResourceDictionary qui est spécifié comme dictionnaire fusionné, soit comme alternative à spécifier Source, soit en plus des ressources incluses dans la source spécifiée.It is legal to define resources within a ResourceDictionary that is specified as a merged dictionary, either as an alternative to specifying Source, or in addition to whatever resources are included from the specified source. 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.However, this is not a common scenario; the main scenario for merged dictionaries is to merge resources from external file locations. Si vous souhaitez spécifier des 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.If you want to specify resources within the markup for a page, you should typically define these in the main ResourceDictionary and not in the merged dictionaries.

Comportement d’un dictionnaire fusionnéMerged Dictionary Behavior

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.Resources in a merged dictionary occupy a location in the resource lookup scope that is just after the scope of the main resource dictionary they are merged into. 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é.Although a resource key must be unique within any individual dictionary, a key can exist multiple times in a set of merged dictionaries. Dans ce cas, la ressource retournée provient du dernier dictionnaire trouvé de manière séquentielle dans la collection MergedDictionaries.In this case, the resource that is returned will come from the last dictionary found sequentially in the MergedDictionaries collection. Si la collection MergedDictionaries a été définie dans XAMLXAML, l’ordre des dictionnaires fusionnés dans la collection correspond à l’ordre des éléments comme indiqué dans le balisage.If the MergedDictionaries collection was defined in XAMLXAML, then the order of the merged dictionaries in the collection is the order of the elements as provided in the markup. 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.If a key is defined in the primary dictionary and also in a dictionary that was merged, then the resource that is returned will come from the primary dictionary. 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.These scoping rules apply equally for both static resource references and dynamic resource references.

Dictionnaires fusionnés et codeMerged Dictionaries and Code

Il est possible d’ajouter des dictionnaires fusionnés à un dictionnaire Resources avec du code.Merged dictionaries can be added to a Resources dictionary through code. La valeur par défaut, initialement vide ResourceDictionary qui existe pour toute propriété Resources possède également une propriété de collection par défaut, initialement vide MergedDictionaries.The default, initially empty ResourceDictionary that exists for any Resources property also has a default, initially empty MergedDictionaries collection property. Pour ajouter un dictionnaire fusionné par le biais du code, vous obtenez une référence au ResourceDictionaryprincipal souhaité, obtenez sa valeur de propriété MergedDictionaries et appelez Add sur le Collection générique contenu dans MergedDictionaries.To add a merged dictionary through code, you obtain a reference to the desired primary ResourceDictionary, get its MergedDictionaries property value, and call Add on the generic Collection that is contained in MergedDictionaries. L’objet que vous ajoutez doit être un nouveau ResourceDictionary.The object you add must be a new ResourceDictionary. Dans le code, vous ne définissez pas la propriété Source.In code, you do not set the Source property. Au lieu de cela, vous devez obtenir un objet ResourceDictionary en en créant un ou en chargeant un objet.Instead, you must obtain a ResourceDictionary object by either creating one or loading one. L’une des façons de charger un ResourceDictionary existant pour appeler XamlReader.Load sur un flux de fichier de XAMLXAML existant qui a une racine de ResourceDictionary, puis de convertir la valeur de retour XamlReader.Load en ResourceDictionary.One way to load an existing ResourceDictionary to call XamlReader.Load on an existing XAMLXAML file stream that has a ResourceDictionary root, then casting the XamlReader.Load return value to ResourceDictionary.

URI de dictionnaire de ressources fusionnéMerged Resource Dictionary URIs

Il existe plusieurs techniques pour inclure un dictionnaire de ressources fusionné, qui sont indiquées par le format d’URI (Uniform Resource Identifier) que vous allez utiliser.There are several techniques for how to include a merged resource dictionary, which are indicated by the uniform resource identifier (URI) format that you will use. 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.Broadly speaking, these techniques can be divided into two categories: resources that are compiled as part of the project, and resources that are not compiled as part of the project.

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.For resources that are compiled as part of the project, you can use a relative path that refers to the resource location. Le chemin relatif est évalué pendant la compilation.The relative path is evaluated during compilation. Votre ressource doit être définie dans le cadre du projet comme une action de génération de ressources.Your resource must be defined as part of the project as a Resource build action. 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.If you include a resource .xaml file in the project as Resource, you do not need to copy the resource file to the output directory, the resource is already included within the compiled application. 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.You can also use Content build action, but you must then copy the files to the output directory and also deploy the resource files in the same path relationship to the executable.

Notes

N’utilisez pas l’action de génération de ressource incorporée.Do not use the Embedded Resource build action. L’action de génération elle-même est prise en charge pour les applications WPFWPF, mais la résolution de Source n’incorpore pas ResourceManageret ne peut donc pas séparer la ressource individuelle du flux.The build action itself is supported for WPFWPF applications, but the resolution of Source does not incorporate ResourceManager, and thus cannot separate the individual resource out of the stream. Vous pouvez toujours utiliser la ressource incorporée à d’autres fins tant que vous avez également utilisé ResourceManager pour accéder aux ressources.You could still use Embedded Resource for other purposes so long as you also used ResourceManager to access the resources.

Une technique similaire consiste à utiliser un URI à en-tête pack dans un fichier XAMLXAML et y faire référence en tant que source.A related technique is to use a Pack URI to a XAMLXAML file, and refer to it as Source. Un URI à en-tête pack active les références aux composants des assemblys référencés et d’autres techniques.Pack URI enables references to components of referenced assemblies and other 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.For more information on Pack URIs, see WPF Application Resource, Content, and Data Files.

Pour les ressources qui ne sont pas compilées dans le cadre du projet, l’URI est évalué au moment de l’exécution.For resources that are not compiled as part of the project, the URI is evaluated at run time. Vous pouvez utiliser un transport d’URI courant, tel que file: ou http:, pour faire référence au fichier de ressources.You can use a common URI transport such as file: or http: to refer to the resource file. 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.The disadvantage of using the noncompiled resource approach is that file: access requires additional deployment steps, and http: access implies the Internet security zone.

Réutilisation des dictionnaires fusionnésReusing Merged Dictionaries

Vous pouvez réutiliser ou partager les dictionnaires de ressources fusionnés entre les applications, car le dictionnaire de ressources à fusionner peut être référencé via n’importe quel URI (Uniform Resource Identifier) valide.You can reuse or share merged resource dictionaries between applications, because the resource dictionary to merge can be referenced through any valid uniform resource identifier (URI). 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.Exactly how you do this will depend on your application deployment strategy and which application model you follow. 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.The aforementioned Pack URI strategy provides a way to commonly source a merged resource across multiple projects during development by sharing an assembly reference. 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é.In this scenario the resources are still distributed by the client, and at least one of the applications must deploy the referenced assembly. Il est aussi possible de référencer des ressources fusionnées via un URI distribué qui utilise le protocole http.It is also possible to reference merged resources through a distributed URI that uses the http protocol.

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.Writing merged dictionaries as local application files or to local shared storage is another possible merged dictionary / application deployment scenario.

LocalisationLocalization

Si les ressources à localiser sont isolées dans des dictionnaires qui sont fusionnés dans des dictionnaires principaux et conservées dans un format XAMLXAML libre, ces fichiers peuvent être localisés séparément.If resources that need to be localized are isolated to dictionaries that are merged into primary dictionaries, and kept as loose XAMLXAML, these files can be localized separately. Cette technique est une solution de rechange simplifiée de la localisation des assemblys de ressources satellites.This technique is a lightweight alternative to localizing the satellite resource assemblies. Pour plus d’informations, consultez Vue d’ensemble de la globalisation et de la localisation WPF.For details, see WPF Globalization and Localization Overview.

Voir aussiSee also