70 votes

Comment inclure une police externe dans une application WPF sans l'installer ?

Comment inclure une police externe dans une application WPF sans l'installer ?

J'ai essayé ce code

  System.Drawing.Text.PrivateFontCollection privateFonts = new    System.Drawing.Text.PrivateFontCollection();
  privateFonts.AddFontFile("C:\\Documents and Settings\\somefont.ttf");
  System.Drawing.Font font = new Font(privateFonts.Families[0], 12);
  this.label1.Font = font;

Il fonctionne correctement dans Windows Form Application mais pas dans WPF.

174voto

MovGP0 Points 77

Il existe deux façons de procéder. La première consiste à regrouper les polices dans l'application. L'autre consiste à placer les polices dans un dossier. La différence réside principalement dans l'URI dont vous avez besoin pour charger les fichiers.

Paquet avec application

  1. Ajouter un /Fonts à votre solution.

  2. Ajouter les polices True Type ( *.ttf ) dans ce dossier

  3. Inclure les fichiers dans le projet

  4. Sélectionnez les polices et ajoutez-les à la solution.

  5. Définir BuildAction: Resource y Copy To Output Directory: Do not copy . Votre .csproj devrait maintenant avoir une section comme celle-ci :

      <ItemGroup>
       <Resource Include="Fonts\NotoSans-Bold.ttf" />
       <Resource Include="Fonts\NotoSans-BoldItalic.ttf" />
       <Resource Include="Fonts\NotoSans-Italic.ttf" />
       <Resource Include="Fonts\NotoSans-Regular.ttf" />
       <Resource Include="Fonts\NotoSansSymbols-Regular.ttf" />
     </ItemGroup>
  6. En App.xaml ajouter <FontFamily> Ressources. Il devrait ressembler à l'exemple de code suivant. Notez que l'URI ne contient pas le nom du fichier lors du conditionnement avec l'application.

     <Applicaton ...>
     <Application.Resources>
         <FontFamily x:Key="NotoSans">pack://application:,,,/Fonts/#Noto Sans</FontFamily>
         <FontFamily x:Key="NotoSansSymbols">pack://application:,,,/Fonts/#Noto Sans Symbols</FontFamily>
     </Application.Resources>
     </Application>
  7. Appliquez vos polices comme ceci :

     <TextBlock x:Name="myTextBlock" Text="foobar" FontFamily="{StaticResource NotoSans}" 
                FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
  8. Vous pouvez également définir la police de caractères de manière impérative :

     myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./Fonts/#Noto Sans");

Copier dans le répertoire de sortie

  1. Ajouter un /Fonts à votre solution.

  2. Ajouter les polices True Type ( *.ttf ) dans cet ordre

  3. Inclure les fichiers dans le projet

  4. Sélectionnez les polices et ajoutez-les à la solution.

  5. Définir BuildAction: Content y Copy To Output Directory: Copy if newer o Copy always . Votre .csproj devrait maintenant avoir une section comme celle-ci :

      <ItemGroup>
       <Content Include="Fonts\NotoSans-Bold.ttf">
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
       <Content Include="Fonts\NotoSans-BoldItalic.ttf">
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
       <Content Include="Fonts\NotoSans-Italic.ttf">
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
       <Content Include="Fonts\NotoSans-Regular.ttf">
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
       <Content Include="Fonts\NotoSansSymbols-Regular.ttf">
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </Content>
     </ItemGroup>
  6. En App.xaml ajouter <FontFamily> Ressources. Il devrait ressembler à l'exemple de code suivant.

     <Applicaton ...>
     <Application.Resources>
         <FontFamily x:Key="NotoSansRegular">./Fonts/NotoSans-Regular.ttf#Noto Sans</FontFamily>
         <FontFamily x:Key="NotoSansItalic">./Fonts/NotoSans-Italic.ttf#Noto Sans</FontFamily>
         <FontFamily x:Key="NotoSansBold">./Fonts/NotoSans-Bold.ttf#Noto Sans</FontFamily>
         <FontFamily x:Key="NotoSansBoldItalic">./Fonts/NotoSans-BoldItalic.ttf#Noto Sans</FontFamily>
         <FontFamily x:Key="NotoSansSymbols">./Fonts/NotoSans-Regular.ttf#Noto Sans Symbols</FontFamily>
     </Application.Resources>
     </Application>
  7. Appliquez vos polices comme ceci :

     <TextBlock Text="foobar" FontFamily="{StaticResource NotoSansRegular}" 
                FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />

Références

33voto

Pavlo Hermanov Points 454

J'utilise un tel code XAML :

<Style x:Key="Hatten">
        <Setter Property="TextElement.FontFamily" Value="Resources/#HATTEN" />
</Style>

HATTEN - référence à hatten.tft dans Ressources.

Utilisation du style :

 <TextBlock x:Name="lblTitle" Style="{DynamicResource Hatten}" FontSize="72"></TextBlock>

23voto

Clark Kent Points 5845

La meilleure réponse à cette question, je l'ai trouvée ici

http://geekswithblogs.net/Martinez/archive/2010/01/29/custom-font-in-wpf-application.aspx

SOLUTION Cela implique l'utilisation d'une ficelle encore plus méchante qu'auparavant, mais cela fonctionne comme prévu :

<Label FontFamily="pack://application:,,,/Folder1/#Katana Sans">Text</Label> 

Où se trouve Folder1 est un dossier de votre projet où vous gardez un fichier TTF. Trois notes à la fin :

  1. Katana Sans" est le nom de la police, pas le nom du fichier. C'est une différence importante. Pour obtenir le nom de la police, il suffit de cliquer deux fois sur le fichier. Notez que les espaces sont inclus sans aucune modification dans cette chaîne.

  2. N'oubliez pas de mettre le signe dièse '#' devant le nom de la police. Sinon, cela ne fonctionnera pas.

  3. Une police personnalisée peut également être ajoutée au projet avec l'option "Build Action" définie sur "Content". Cette approche n'est toutefois pas recommandée et, par souci de simplicité, j'ai ignoré cette possibilité.

Quelques liens supplémentaires

https://msdn.microsoft.com/en-us/library/ms753303(v=vs.100).aspx

https://msdn.microsoft.com/en-us/library/cc296385.aspx

10voto

Je n'ai pas trouvé de réponse à cette question. Mais j'ai trouvé une solution que je n'ai pas vue sur Internet.

J'ai suivi une recommandation consistant à créer un dossier et à marquer tous les fichiers qu'il contient comme des ressources. Mais j'avais besoin de les énumérer, et c'était mon principal problème, car j'ai besoin de les charger tous sur mon écran sans enregistrer le nom quelque part. Je veux simplement déposer une autre police dans ce dossier et l'énumérer.

J'ai trouvé cette solution pour lister tous les fichiers dans mon dossier ressources/fontes.

Fonts.GetFontFamilies(new Uri("pack://application:,,,/resources/fonts/#"))

J'espère qu'il vous aidera à organiser vos polices.

9voto

StudioX Points 96

La manière la plus simple d'inclure des polices externes est de

Étape 1. Créer le dossier Fonts Et ajoutez-y vos polices.

enter image description here

Étape 2. Définir l'action de construction sur content et Copier dans le répertoire de sortie pour Copy always .

enter image description here

Étape 3. Construisez la solution pour la mettre à jour avec le répertoire des polices.

Étape 4. Utilisez la police dans vos éléments en utilisant FontFamily="Fonts/#font name"

enter image description here

C'est fait !

Merci à cscience !

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