web-dev-qa-db-fra.com

Comment inclure des polices externes dans l'application WPF sans les installer

Comment inclure des polices externes dans l'application WPF sans les 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;

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

37
Shebin

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.

Utiliser le style:

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

Ce sont deux façons de faire cela. Une solution consiste à conditionner les polices dans l'application. L'autre façon consiste à avoir les polices du dossier de sortie séparément. La différence réside principalement dans l'URI dont vous avez besoin pour charger les fichiers. 

Paquet avec application

  1. Ajoutez un dossier /Fonts à votre solution. 
  2. Ajouter les fichiers True Type Fonts (*.ttf) à ce dossier 
  3. Inclure les fichiers dans le projet
  4. Sélectionnez les polices et ajoutez-les à la solution
  5. Définissez BuildAction: Resource et Copy To Output Directory: Do not copy. Votre fichier .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. Dans App.xaml, ajoutez <FontFamily> Ressources. Cela devrait ressembler à l'exemple de code suivant. Notez que l'URI ne contient pas le nom du fichier lorsque vous compilez 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 impérativement: 

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

Copier dans le répertoire de sortie

  1. Ajoutez un dossier /Fonts à votre solution. 
  2. Ajoutez les fichiers True Type Fonts (*.ttf) à cet ordre. 
  3. Inclure les fichiers dans le projet
  4. Sélectionnez les polices et ajoutez-les à la solution
  5. Définissez BuildAction: Content et Copy To Output Directory: Copy if newer. Votre fichier .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. Dans App.xaml, ajoutez <FontFamily> Ressources. Cela devrait ressembler à l'exemple de code suivant. Notez que l'URI ne contient pas le nom du fichier lorsque vous compilez avec l'application. 

    <Applicaton ...>
    <Application.Resources>
        <FontFamily x:Key="NotoSansRegular">./Fonts/NotoSans-Regular.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansItalic">./Fonts/NotoSans-Italic.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansBold">./Fonts/NotoSans-Bold.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansBoldItalic">./Fonts/NotoSans-BoldItalic.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansSymbols">./Fonts/NotoSans-Regular.tts#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

74
MovGP0

La meilleure réponse à cette question que j'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 chaîne encore plus mauvaise qu'auparavant, mais fonctionne comme prévu: 

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

Où is Folder1 est un dossier de votre projet dans lequel vous conservez un fichier TTF . Trois notes à la fin:

  1. "Katana" est le nom de la police, pas le nom du fichier. C'est une différence significative. Pour obtenir le nom de la police, cliquez simplement deux fois sur le fichier.

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

  3. Une police personnalisée peut également être ajoutée au projet avec "Action de construction" définie sur "Contenu". Cette approche n’est toutefois pas recommandée et, dans un 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

14

Je n'ai trouvé aucune réponse à ce sujet… .. Mais j'ai trouvé une solution que je n'ai pas vue sur Internet.

J'ai suivi la recommandation de créer un dossier et de marquer tous les fichiers à l'intérieur de Ressources . Mais je devais les énumérer, et c'était mon principal problème, car je devais tout charger sur mon écran sans enregistrer le nom quelque part. Je veux simplement déposer une autre police dans ce dossier et la lister.

J'ai trouvé cela comme une solution pour lister tous les fichiers dans mon dossier ressources/polices

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

Je pense que cela vous aidera à organiser vos polices.

J'utilise xaml pour cela

<Window

 FontFamily ="./Fonts/#somefont"

>

J'ai inclus le fichier de police dans le dossier "Polices"

4
Tharu

J'ai un dossier de polices à l'intérieur d'un dossier d'actifs dans mon projet. Au moment de la construction, il copiera ces polices dans le dossier en tant que contenu. Ensuite, je peux simplement utiliser le code XAML suivant pour utiliser la police FontAwesome afin d’avoir une icône sur mon bouton.

<Button Content="&#xf0c9;" FontFamily="./assets/fonts/#FontAwesome">
2
Steve Parish

Voici ce qui a fonctionné pour moi:

(1) Ajouter un répertoire au projet: fonte

(2) Déplacer le fichier de police ttf dans le répertoire des polices

(3) Ajouter le fichier de police ttf au projet

(4) Définissez la propriété "Build" du fichier de police tff sur "Resource" (Remarque: j'ai utilisé "Ressource" au lieu de "Ressource intégrée" Dans la sélection de liste déroulante.)

(5) Ouvrez la fenêtre dans laquelle vous utilisez la police et créez le changements suivants:

<Window ... >
    <Window.Resources>
        <FontFamily x:Key="YourFontNickName">
        pack://application:,,,/font/#NameOfFont
        <!-- Note: NameOfFont can be font by double clicking
             on font from Explorer and writing down name
             of the font reported.  Its not the same
             as the file name -->
        </FontFamily>   
    </Window.Resources>


    <!-- Use font as Xaml -->
    <StackPanel>
        <Textblock FontFamily="{StaticResource YourFontNickName}">
        This is a test
        </Testblock>
        <Textblock Name="text1"/>
    </StackPanel>
...
</Window>

(6) Si vous voulez changer la police à partir du code. Faire ceci:

public partial class Window1 : Window {

    // Use font as C# Code
    public void UpdateText1() {

            text1.Text      = "Hi There";
            FontFamily ff   = this.Resources["YourFontNickName"] 
                                as FontFamily;
            if (ff == null) {
                Messagebox.Show("Wrong Font Name", "ERROR");
                return;
            }
            text1.FontFamily = ff;
            text1.FontSize   = 30;
    }

    ...
}
1
Bill Moore

Commencez par copier les polices dans le dossier du projet tel que /Resources/Fonts/ et définir les propriétés de la police -> Action de construction: Ressource

Deuxième) Utilisé sur le code 

FontFamily="/AssemblyNamespace;component/Resources/Fonts/IranSans/#IRANSansWeb Medium"

 enter image description here

0
Moslem Shahsavan

J'essayais de faire en sorte que cela fonctionne aussi avec une police différente, Cela ne fonctionnait que pour moi dans ce format avec le ./Fonts 

<FontFamily x:Key="NotoSans">pack://application:,,,./Fonts/#Noto Sans</FontFamily>

0
Eric Unger