269 votes

ResourceDictionary dans une assemblée séparée

Je dispose de fichiers de dictionnaire de ressources (MenuTemplate.xaml, ButtonTemplate.xaml, etc.) que je souhaite utiliser dans plusieurs applications distinctes. Je pourrais les ajouter aux assemblages des applications, mais il est préférable que je compile ces ressources dans un seul assemblage et que mes applications y fassent référence, n'est-ce pas ?

Une fois l'assemblage de ressources construit, comment puis-je le référencer dans le App.xaml de mes applications ? Actuellement, j'utilise ResourceDictionary.MergedDictionaries pour fusionner les fichiers de dictionnaire individuels. Si je les ai dans un assemblage, comment puis-je les référencer dans le xaml ?

1 votes

C'est peut-être un peu exagéré, mais vous pouvez préparer vos ressources pour l'exportation en utilisant la technique décrite ici : alexfeinberg.wordpress.com/2015/08/16/ . Le principal avantage de cette méthode est d'éviter les problèmes liés au chargement de plusieurs versions de l'assemblage de ressources dans le même domaine d'application.

384voto

Kent Boogaart Points 97432

Consultez le syntaxe URI du pack . Vous voulez quelque chose comme ça :

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>

2 votes

Que faire si YourAssembly ne se trouve pas dans le chemin d'accès de l'application ?

0 votes

@Engineer Spock : alors le CLR ne le trouvera pas sans aide (rien à voir spécifiquement avec WPF). Soit vous ajoutez des chemins de recherche à votre app.config ou de l'attacher à AppDomain.AssemblyResolve pour l'aider à trouver l'assemblage.

1 votes

Dois-je ajouter le chemin de sondage si le projet YourAssembly est au même niveau que le projet d'application qui doit faire référence à YourAssembly ? Par exemple, C:\Solution\AppProject\ y C:\Solution\YourAssemblyProject\

106voto

Hertzel Guinness Points 2983

Un exemple, pour que la réponse ne dure que 15 secondes

Disons que vous avez "styles.xaml" dans une bibliothèque WPF appelée "common" et que vous voulez l'utiliser à partir de votre projet d'application principal :

  1. Ajouter une référence du projet principal au projet "commun".
  2. Votre app.xaml doit contenir :

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

4 votes

Et ensuite, comment rendre les ressources définies dans styles.xaml disponibles via la fenêtre Propriétés de Visual Studio 2010 ? Si je sélectionne un élément, puis que je clique sur Appliquer la ressource pour sa propriété Arrière-plan, il n'affiche que SystemColors et pas celles définies dans styles.xaml. Mais si je tape moi-même le nom de la ressource dans le XAML, cela fonctionne, donc elle est correctement référencée.

1 votes

Je voulais juste ajouter que si vous faites référence au ResourceDictionary à partir de UserControl, vous devez ajouter une référence à l'assemblage aux deux endroits : dans le UserControl et dans le projet de la fenêtre principale. Sinon, vous obtiendrez l'erreur d'exécution.

40voto

Aleksandar Toplek Points 874

Je travaille avec .NET 4.5 et je n'ai pas réussi à obtenir ce résultat... J'utilisais la bibliothèque de contrôles personnalisés WPF. Cela a fini par fonctionner pour moi...

<ResourceDictionary Source="/MyAssembly;component/mytheme.xaml" />

source : http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/11a42336-8d87-4656-91a3-275413d3cc19

22voto

CharithJ Points 15364

La DLL à ressources seules est une option pour vous. Mais elle n'est pas forcément nécessaire, sauf si vous souhaitez modifier les ressources sans recompiler les applications. Avoir un seul fichier ResourceDictionary commun est également une option. Cela dépend de la fréquence à laquelle vous modifiez les ressources, etc.

<ResourceDictionary Source="pack://application:,,,/
     <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/>

MonAssemblée - Juste le nom de l'assemblage sans l'extension

FolderStructureInAssembly - Si vos ressources sont dans un dossier, spécifiez la structure du dossier.

Lorsque vous faites cela, il vaut mieux être conscient que siteOfOrigin également.

WPF prend en charge deux autorités : application:/// et siteoforigin:///. L'autorité application:/// identifie les fichiers de données d'une application qui sont connus au moment de la compilation, y compris les fichiers de ressources et de contenu. L'autorité siteoforigin:/// identifie les fichiers de site d'origine. La portée de chaque autorité est illustrée dans la figure suivante.

enter image description here

10voto

Gianluca Demarinis Points 1118

Pour UWP :

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X