Question

J'ai deux bibliothèques et un ensemble unique d'application mise en page du projet et je me demande comment puis-je faire référence à des styles par leur clé dans l'une de mes bibliothèques qui est défini dans l'autre.

Ma mise en page de la solution:

  • WpfControls.dll - Peut contenir des contrôles réutilisables génériques comme un contrôle NumericUpDown basé WPF ainsi que d'autres contrôles de base et certains styles ainsi que je voudrais faire réutilisable. Par souci de l'exemple permet de dire que mon style clé ici est défini comme MyButtonStyle .
  • SpecializedControls.dll - Peut contenir des contrôles qui sont spécialisés à notre application tels que les contrôles composites personnalisés et UserControls dans WPF. C'est là que je voudrais faire référence à la MyButtonStyle style défini dans l'assemblage WpfControls.dll.
  • Application.exe -. Cet ensemble utilise des contrôles définis dans l'assemblage SpecializedControls.dll

Je l'ai vu quelques exemples expliquant comment faire avec une simple bibliothèque de contrôle unique et l'assemblage application, mais dans mon cas j'ai deux assemblées et une application. Donc, en d'autres termes dans mon cas, je n'ai pas App.xaml dans ma deuxième bibliothèque de contrôle où je pouvais utiliser le concept de MergeDictionaries. Je suis sûr que si je voulais je pouvais mettre une référence MergedDictionaries directement dans chaque commande fichier XAML pour fusionner tous generic.xaml défini dans l'assemblage WpfControls.dll mais je pense que cela entraînerait des styles être fusionnés dans divers redondance lieux dans mon assemblée de SpecializedControls qui ne semble pas la meilleure solution. Pour aggraver les choses, ces dictionnaires peuvent également être fusionnés en Application.exe aussi bien, que cela commence à enfler mon application lors de l'exécution?

Quelqu'un peut-il clarifier la recommandation ou la meilleure approche pour le partage de ces styles avec le moins de frais généraux programtic et des ressources.

Mise à jour : Après un peu plus de tests, il semble que je ne parviens pas à référencer toute ressource définie dans generic.xaml par sa même clé dans le même ensemble. Il peut y avoir quelque chose de tout à fait tort sur la façon dont je comprends comment les clés de ressources fonctionnent donc je vais devoir un peu plus de recherche, ainsi que la recherche en ComponentResourceKey. Si quelqu'un a des conseils ou des suggestions s'il vous plaît aider.

Était-ce utile?

La solution

recherche des ressources dans WPF fonctionne dans une hiérarchie:. L'arbre logique, puis les ressources d'application, les ressources thématiques et enfin les ressources du système

Ressources thématiques peuvent généralement être accessibles que de manière implicite (même dans l'ensemble, ils sont définis). Ceci ne concerne que pour les styles, où le TargetType peut être utilisé comme la clé implicite.

Pour accomplir ce que vous essayez de faire, il y a deux options:

  • Utilisez ComponentResourceKey . Ceci est une ressource clé spéciale qui permet aux ressources de référencement d'autres assemblées. Par exemple, vous pouvez définir un pinceau dans WpfControls thème dictionnaire:

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
        <GradientStop Color="Red" />
        <GradientStop Color="Blue" Offset="1" />
    </LinearGradientBrush>
    

    Et vous pouvez faire référence à SpecializedControls :

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
    
  • Utilisez MergedDictionaries pour importer un dictionnaire dans les ressources d'application. Vous pouvez le faire dans la Application l'assemblage, et lorsque les charges d'application, même les contrôles qui sont SpecializedControls seraient en mesure d'utiliser ces ressources. Vous aurez un problème avec l'expérience en temps de conception dans ce scénario, que vous pouvez résoudre en mettant un App.xaml faux dans SpecializedControls , qui contiendrait également une référence au dictionnaire.

Hope this helps,

Aelij.

Autres conseils

La réponse acceptée est correcte, je suis en train d'expliquer comment utiliser MergedDictionaries

App.xaml ,

    <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/-DirectoryName-/FileName.xaml"/>
            <!-- Use Below syntax if your resource file is not inside a directory(in root) -->
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/FileName.xaml"/>
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top