2017-10-06 7 views
1

Je suis en train de créer une application qui utilise ResourceDictionaries d'autres assemblages et j'ai des problèmes avec l'utilisation des polices.XAML - Utilisation des polices du dictionnaire de ressources d'un autre assembly

Il existe un assembly nommé MyFontAssembly qui stocke les polices avec leurs références sous la forme ResourceDictionary. La structure de celui-ci se présente comme suit:

MyFontAssembly 
    - FontDictionary.xaml - (stores references to fonts) 
    - Fonts 
     - FontA.ttf 
     - FontB.ttf 
      ... 

Il y a aussi une autre assemblée qui stocke ResourceDictionaries pour les commandes de style et il est appelé MyStylesAssembly. Les ResourceDictionaries de MyStylesAssembly sont ensuite fusionnées dans un App.xaml d'une application afin de fournir des styles réutilisables.

Le problème est que mes styles ne reconnaît les ressources de police (le code ne s'écraser parce qu'il n'a pas pu trouver la ressource par sa clé), mais il semble que les polices stockées sous forme de fichiers TTF ne sont pas appliqués.

J'ai essayé ce qui suit dans mon FontDictionary.xaml, mais rien de tout cela fonctionne:

<FontFamily x:Key="MyFontKey">Fonts/#MyFontName</FontFamily> 
<FontFamily x:Key="MyFontKey">pack://application:,,,/MyFontAssemblyName;Component/Fonts/#MyFontName</FontFamily> 
<FontFamily x:Key="MyFontKey">/MyFontAssemblyName;Component/Fonts/#MyFontName</FontFamily> 
<FontFamily x:Key="MyFontKey">pack://application:,,,/Fonts/#MyFontName</FontFamily> 

REMARQUE:

  • Je suis sûr que mes polices forment le travail de TTF et sont correctement nommés . J'utilisais l'implémentation <FontFamily x:Key="MyFontKey">Fonts/#MyFontName</FontFamily> dans le seul projet exe avec la même structure et tout allait bien, le problème est apparu quand j'ai divisé l'implémentation en quelques assemblages, comme je l'ai décrit, lors du refactoring.
  • MyFontAssembly est fusionné correctement dans MyStylesAssembly. Je l'appelle juste par ce nom ici, dans le code réel, il a aussi un peu plus ResourceDictionaries qui sont utilisés correctement par MyStylesAssembly. Le problème semble être avec seulement les balises <FontFamily> ne reconnaissant pas les fichiers ttf.
  • MyFontAssembly et MyStylesAssembly sont des projets de tyle ClassLibrary et ne contient pas de code autre que dans ResourceDictionaries (pas de classes ou code derrière)
+0

Utilisez-vous la refrence correcte. U besoin de référencer les conventions de document du package XAML URI si cela ne fonctionne pas – Ramankingdom

+0

Je n'utilise probablement pas la méthode correcte pour référencer les polices, mais je ne sais pas quelle est la bonne manière de le faire (c'est un peu ma question, ici). –

+0

Mettre à jour l'exemple avec l'exemple – Ramankingdom

Répondre

1

J'ai trouvé une réponse here.Je devais régler build action-resource, les référencer puis en utilisant:

<FontFamily x:Key="MyFontKey">pack://application:,,,/MyFontAssemblyName;Component/Fonts/#MyFontName</FontFamily> 

ou la version plus courte:

<FontFamily x:Key="MyFontKey">/MyFontAssemblyName;Component/Fonts/#MyFontName</FontFamily> 
1

Créer une classe WPF Library.Lets Say FontLibraryCommon enter image description here

Maintenant, supprimez App.Xaml et MainWIndow.Xaml comme indiqué ci-dessous enter image description here

maintenant modifier les propriétés du projet à la bibliothèque de classe et compilez

enter image description here

maintenant Ajouter la police des dossiers et fichiers TTF existants sous comme indiqué. J'utilise la police Pacifico par exemple enter image description here enter image description here

ajouter maintenant ResourceDictioanry laisser dire FontDictioanry.XAML dans votre bibliothèque et votre XAML devrait ressembler à ceci

Voici le code

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:local="clr-namespace:FontLibraryCommon"> 
    <FontFamily x:Key="Pacifico">Fonts/#Pacifico</FontFamily> 

</ResourceDictionary> 

maintenant dans l'autre projet ajouter bibliothèque de polices comme référence Et dans votre MainWindow.xaml `

<Window.Resources> 
    <ResourceDictionary Source="pack://application:,,,/FontLibraryCommon;component/FontDictioanry.xaml"></ResourceDictionary> 
</Window.Resources>` 

Enfin Lets étiquette Dites que vous pouvez définir comme celui-ci

<Label FontFamily="{StaticResource Pacifico}"> Raman</Label> 
+0

C'est à peu près ce que j'ai fait dans mon application. (Il existe également un type de projet ClassLibrary lorsque vous créez un nouveau projet, vous n'avez donc pas besoin de supprimer App.xaml et de modifier le type de sortie) –

+0

alors à quel problème êtes-vous confronté? Cela ne fonctionnera que pendant l'exécution – Ramankingdom

1

Voici une façon de faire référence à une police de la bibliothèque déférent. Disons que nous avons appelé la bibliothèque MyAwesomeFonts et voici sa structure de projet:

MyAwesomeFontsLibrary 
| 
|__ Fonts\ 
|  | 
|  |__ Fonts.cs 
|  |__ MyAwesomeFont.ttf 
| 
|__ Themes\ 
     | 
     |__ generic.xaml 

Dans le dossier Fonts\ vous mettez vos polices, et dans le fichier generic.xaml vous déclarez votre police normalement comme ceci:

xmlns:fonts="clr-namespace:MyAwesomeFontsLibrary.Fonts"... 
<FontFamily 
    x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type fonts:Fonts}, ResourceId=MyAwesomeFont}">Fonts/#My Awesome Font Name</FontFamily> 

et dans le fichier Fonts.cs contient:

// say this class declared in namespace: MyAwesomeLibrary.Fonts 
public class Fonts 
{ 
    public static ComponentResourceKey MyAwesomeFontKey => new ComponentResourceKey(typeof(Fonts), "MyAwesomeFont"); 
} 

Pour chaque police vous avez vous faites les mêmes choses faites ci-dessus, vous ajoutez le dossier Fonts, les déclarer comme ressource dans le fichier generic.xaml et enfin créer une propriété statique dans Fonts.cs

maintenant construire votre bibliothèque, ajoutez référence dans projet où vous veulent utiliser et ajouter un espace de noms de votre AwesomeFontsLibrary à votre XAML quelque chose comme ça:

<... xmlns:fonts="clr-namespace:MyAwesomeFontsLibrary.Fonts;assembly=MyAwesomeFontsLibrary" > 

maintenant, voici deux extraits de réutiliser vos AwesomeFontsLibrary Fonts dans TextBlock et style:

In Style:

<Style x:Key="MyTextBlockStyle" 
      TargetType="TextBlock"> 
     <Setter Property="FontFamily" Value="{DynamicResource {x:Static fonts:Fonts.MyAwesomeFontKey}}"></Setter> 
    </Style> 

ou directement dans Textblock:

<TextBlock FontFamily="{DynamicResource {x:Static fonts:Fonts.MyAwesomeFontKey}}" FontSize="50">Welcome!</TextBlock> 

Vous devez utiliser dynamique des ressources, et non ressource statique, lorsque vous utilisez un ComponentResourceKey

Votre nouvelle police mon n'apparaît pas dans la fenêtre du concepteur mais en runtime cela fonctionnera.

Les étapes ci-dessus ont été testées sur ma machine et elles fonctionnent. J'espère que cela aidera.

+0

L'utilisation de DynamicResource au lieu de StaticResource pourrait fonctionner. Je n'y ai pas pensé. De toute façon j'ai trouvé une solution à mon problème sur l'autre question sur la pile. J'ai dû définir l'action de construction de mes fichiers de police à la ressource et cela fonctionne. –