Partager via


Empaquetage des polices avec des applications

Cette rubrique fournit une vue d’ensemble de la façon de empaqueter des polices avec votre application WPF (Windows Presentation Foundation).

Note

Comme pour la plupart des types de logiciels, les fichiers de police sont sous licence, plutôt que vendus. Les licences qui régissent l’utilisation des polices varient d’un fournisseur à l’autre, mais en général la plupart des licences, y compris celles couvrant les polices que Microsoft fournit avec des applications et Windows, n’autorisent pas les polices à être incorporées dans des applications ou redistribuées. Par conséquent, en tant que développeur, il est de votre responsabilité de vous assurer que vous disposez des droits de licence requis pour toute police que vous incorporez dans une application ou redistribuez autrement.

Présentation de l’empaquetage de polices

Vous pouvez facilement empaqueter des polices en tant que ressources dans vos applications WPF pour afficher le texte de l’interface utilisateur et d’autres types de contenu textuel. Les polices peuvent être séparées ou incorporées dans les fichiers d’assembly de l’application. Vous pouvez également créer une bibliothèque de polices contenant uniquement des ressources, à laquelle votre application peut faire référence.

Les polices OpenType et TrueType® contiennent un indicateur de type, fsType, qui indique les droits de licence d’incorporation de police pour la police. Toutefois, cet indicateur de type fait uniquement référence aux polices incorporées stockées dans un document. Il ne fait pas référence aux polices incorporées dans une application. Vous pouvez récupérer les droits d’incorporation de police pour une police en créant un objet GlyphTypeface et en référençant sa propriété EmbeddingRights. Pour plus d’informations sur l’indicateur fsType, reportez-vous à la section « Métriques OS/2 et Windows » de l' Spécification OpenType.

Le Microsoft Typography site Web inclut des informations de contact qui peuvent vous aider à localiser un fournisseur de police particulier ou à trouver un fournisseur de polices pour le travail personnalisé.

Ajout de polices en tant qu’éléments de contenu

Vous pouvez ajouter des polices à votre application en tant qu’éléments de contenu de projet distincts des fichiers d’assembly de l’application. Cela signifie que les éléments de contenu ne sont pas incorporés en tant que ressources au sein d’un assembly. L’exemple de fichier projet suivant montre comment définir des éléments de contenu.

<Project DefaultTargets="Build"  
                xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
  <!-- Other project build settings ... -->  
  
  <ItemGroup>  
    <Content Include="Peric.ttf" />  
    <Content Include="Pericl.ttf" />  
  </ItemGroup>  
</Project>  

Pour vous assurer que l’application peut utiliser les polices au moment de l’exécution, les polices doivent être accessibles dans le répertoire de déploiement de l’application. L’élément <CopyToOutputDirectory> dans le fichier projet de l’application vous permet de copier automatiquement les polices dans le répertoire de déploiement de l’application pendant le processus de génération. L’exemple de fichier projet suivant montre comment copier des polices dans le répertoire de déploiement.

<ItemGroup>  
  <Content Include="Peric.ttf">  
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>  
  </Content>  
  <Content Include="Pericl.ttf">  
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>  
  </Content>  
</ItemGroup>  

L’exemple de code suivant montre comment référencer la police de l’application en tant qu’élément de contenu. L’élément de contenu référencé doit se trouver dans le même répertoire que les fichiers d’assembly de l’application.

<TextBlock FontFamily="./#Pericles Light">
  Aegean Sea
</TextBlock>

Ajout de polices en tant qu’éléments de ressource

Vous pouvez ajouter des polices à votre application en tant qu’éléments de ressource de projet incorporés dans les fichiers d’assembly de l’application. L’utilisation d’un sous-répertoire distinct pour les ressources permet d’organiser les fichiers projet de l’application. L’exemple de fichier projet suivant montre comment définir des polices en tant qu’éléments de ressource dans un sous-répertoire distinct.

<Project DefaultTargets="Build"  
                xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
  <!-- Other project build settings ... -->  
  
  <ItemGroup>  
    <Resource Include="resources\Peric.ttf" />  
    <Resource Include="resources\Pericl.ttf" />  
  </ItemGroup>  
</Project>  

Note

Lorsque vous ajoutez des polices en tant que ressources à votre application, vérifiez que vous définissez l’élément <Resource> et non l’élément <EmbeddedResource> dans le fichier projet de votre application. L’élément <EmbeddedResource> de l’action de génération n’est pas pris en charge.

L’exemple de balisage suivant montre comment référencer les ressources de police de l’application.

<TextBlock FontFamily="./resources/#Pericles Light">
  Aegean Sea
</TextBlock>

Référencement d’éléments de ressource de police à partir du code

Pour référencer des éléments de ressource de police à partir du code, vous devez fournir une référence de ressource de police en deux parties : l’URI (Uniform Resource Identifier) de base ; et la référence d’emplacement de police. Ces valeurs sont utilisées comme paramètres pour la méthode FontFamily. L’exemple de code suivant montre comment référencer les ressources de police de l’application dans le sous-répertoire de projet appelé resources.

// The font resource reference includes the base URI reference (application directory level),
// and a relative URI reference.
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./resources/#Pericles Light");
' The font resource reference includes the base URI reference (application directory level),
' and a relative URI reference.
myTextBlock.FontFamily = New FontFamily(New Uri("pack://application:,,,/"), "./resources/#Pericles Light")

L’URI (Uniform Resource Identifier) de base peut inclure le sous-répertoire d’application où réside la ressource de police. Dans ce cas, la référence d’emplacement de police n’a pas besoin de spécifier un répertoire, mais doit inclure un «./» de début, ce qui indique que la ressource de police se trouve dans le même répertoire spécifié par l’URI (Uniform Resource Identifier) de base. L’exemple de code suivant montre un autre moyen de référencer l’élément de ressource de police, ce qui équivaut à l’exemple de code précédent.

// The base URI reference can include an application subdirectory.
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/resources/"), "./#Pericles Light");
' The base URI reference can include an application subdirectory.
myTextBlock.FontFamily = New FontFamily(New Uri("pack://application:,,,/resources/"), "./#Pericles Light")

Référencement de polices à partir du sous-répertoire de la même application

Vous pouvez placer le contenu de l’application et les fichiers de ressources dans le même sous-répertoire défini par l’utilisateur de votre projet d’application. L’exemple de fichier projet suivant montre une page de contenu et des ressources de police définies dans le même sous-répertoire.

<ItemGroup>  
  <Page Include="pages\HomePage.xaml" />  
</ItemGroup>  
<ItemGroup>  
  <Resource Include="pages\Peric.ttf" />  
  <Resource Include="pages\Pericl.ttf" />  
</ItemGroup>  

Étant donné que le contenu et la police de l’application se trouvent dans le même sous-répertoire, la référence de police est relative au contenu de l’application. Les exemples suivants montrent comment référencer la ressource de police de l’application lorsque la police se trouve dans le même répertoire que l’application.

<TextBlock FontFamily="./#Pericles Light">
  Aegean Sea
</TextBlock>
// The font resource reference includes the base Uri (application directory level),
// and the file resource location, which is relative to the base Uri.
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "/pages/#Pericles Light");
' The font resource reference includes the base Uri (application directory level),
' and the file resource location, which is relative to the base Uri.
myTextBlock.FontFamily = New FontFamily(New Uri("pack://application:,,,/"), "/pages/#Pericles Light")

Énumération de polices dans une application

Pour énumérer les polices en tant qu’éléments de ressource dans votre application, utilisez la méthode GetFontFamilies ou GetTypefaces. L’exemple suivant montre comment utiliser la méthode GetFontFamilies pour récupérer la collection d’objets FontFamily depuis l’emplacement de police de l’application. Dans ce cas, l’application contient un sous-répertoire nommé « resources ».

foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new Uri("pack://application:,,,/"), "./resources/"))
{
    // Perform action.
}
For Each fontFamily As FontFamily In Fonts.GetFontFamilies(New Uri("pack://application:,,,/"), "./resources/")
    ' Perform action.
Next fontFamily

L'exemple suivant montre comment utiliser la méthode GetTypefaces pour obtenir la collection d'objets Typeface depuis l'emplacement des polices de l'application. Dans ce cas, l’application contient un sous-répertoire nommé « resources ».

foreach (Typeface typeface in Fonts.GetTypefaces(new Uri("pack://application:,,,/"), "./resources/"))
{
    // Perform action.
}
For Each typeface As Typeface In Fonts.GetTypefaces(New Uri("pack://application:,,,/"), "./resources/")
    ' Perform action.
Next typeface

Création d’une bibliothèque de ressources de police

Vous pouvez créer une bibliothèque de ressources uniquement qui contient uniquement des polices. Aucun code ne fait partie de ce type de projet de bibliothèque. La création d’une bibliothèque de ressources uniquement est une technique courante de découplage des ressources à partir du code d’application qui les utilise. Cela permet également à l’assembly de bibliothèque d’être inclus dans plusieurs projets d’application. L’exemple de fichier projet suivant montre les parties clés d’un projet de bibliothèque de ressources uniquement.

<PropertyGroup>  
  <AssemblyName>FontLibrary</AssemblyName>  
  <OutputType>library</OutputType>  
  ...  
</PropertyGroup>  
...
<ItemGroup>  
  <Resource Include="Kooten.ttf" />  
  <Resource Include="Pesca.ttf" />  
</ItemGroup  

Référencement d’une police dans une bibliothèque de ressources

Pour référencer une police dans une bibliothèque de ressources à partir de votre application, vous devez faire précéder la référence de police du nom de l’assembly de bibliothèque. Dans cet exemple, l’assembly de ressource de police est « FontLibrary ». Pour séparer le nom de l'assemblage de la référence dans l'assemblage, utilisez un caractère « ; ». L’ajout du mot clé « Component » suivi de la référence au nom de police termine la référence complète à la ressource de la bibliothèque de polices. L’exemple de code suivant montre comment référencer une police dans un assembly de bibliothèque de ressources.

<Run FontFamily="/FontLibrary;Component/#Kootenay" FontSize="36">
  ABCDEFGHIJKLMNOPQRSTUVWXYZ
</Run>

Note

Ce Kit de développement logiciel (SDK) contient un ensemble d’exemples de polices OpenType que vous pouvez utiliser avec des applications WPF. Les polices sont définies dans une bibliothèque de ressources uniquement. Pour plus d’informations, consultez exemple de pack de police OpenType.

Limitations relatives à l’utilisation des polices

La liste suivante décrit plusieurs limitations sur l’empaquetage et l’utilisation de polices dans les applications WPF :

  • Bits d’autorisation d’incorporation de police : les applications WPF ne vérifient ni n’appliquent aucun des bits d’autorisation d’incorporation de police. Pour plus d'informations, consultez la section Présentation de l’empaquetage de polices.

  • Polices du site d’origine : les applications WPF n’autorisent pas les références de police à un Uniform Resource Identifier (URI) http ou ftp.

  • URI absolu à l’aide de la notation pack: : les applications WPF ne vous permettent pas de créer un objet FontFamily par programmation en utilisant « pack: » comme partie de la référence Uniform Resource Identifier (URI) absolu d’une police. Par exemple, "pack://application:,,,/resources/#Pericles Light" est une référence de police non valide.

  • Intégration automatique des polices : au moment de la conception, il n'existe aucun support pour rechercher l'utilisation des polices dans une application et intégrer automatiquement les polices dans les ressources de l'application.

  • sous-ensembles de polices : Les applications WPF ne prennent pas en charge la création de sous-ensembles de polices pour des documents non fixes.

  • Dans les cas où il existe une référence incorrecte, l’application revient à utiliser une police disponible.

Voir aussi