Empaquetage de 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).

Remarque

Comme avec la plupart des types de logiciels, les fichiers de police sont sous licence et ne sont pas 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, c’est à vous de vérifier que vous disposez des droits de licence nécessaires pour toute police incorporée dans une application ou redistribuée.

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 des fichiers d’assembly de l’application ou y être incorporées. Vous pouvez également créer une bibliothèque de polices de ressources uniquement, que votre application peut référencer.

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 concerne uniquement les polices incorporées stockées dans un document. Il ne concerne pas les polices incorporées dans une application. Vous pouvez récupérer les droits d’incorporation de police pour une police en créant un GlyphTypeface objet et en référençant sa EmbeddingRights propriété. Consultez la section « OS/2 and Windows Metrics » de OpenType Specification pour plus d’informations sur l’indicateur fsType.

Le site web Microsoft Typography inclut des informations de contact pour localiser un fournisseur de police en particulier ou rechercher un fournisseur de police pour une utilisation personnalisée.

Ajout de polices comme éléments de contenu

Vous pouvez ajouter des polices à votre application sous forme d’éléments de contenu de projet séparés des fichiers d’assembly de l’application. Cela signifie que les éléments de contenu ne sont pas incorporés sous forme de ressources dans 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 vérifier que l’application peut utiliser les polices au moment de l’exécution, ces dernières doivent être accessibles dans le répertoire de déploiement de l’application. L’élément <CopyToOutputDirectory> du 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 les 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 comme élément de contenu. L’élément de contenu référencé doit être dans le même répertoire que les fichiers d’assembly de l’application.

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

Ajout de polices comme éléments de ressource

Vous pouvez ajouter des polices à votre application sous forme d’é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 comme é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>  

Remarque

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 dans le <EmbeddedResource> 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 indique 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 de la FontFamily méthode. L’exemple de code suivant indique 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 une autre façon de référencer l’élément de ressource de police. Il est équivalent à 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 même sous-répertoire d’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>  

Comme le contenu de l’application et la police sont dans le même sous-répertoire, la référence de police est relative au contenu d’application. Les exemples suivants montrent comment référencer les ressources de police de l’application quand 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 des polices dans une application

Pour énumérer les polices en tant qu’éléments de ressource dans votre application, utilisez la ou GetTypefaces la GetFontFamilies méthode. L’exemple suivant montre comment utiliser la GetFontFamilies méthode pour retourner la collection d’objets à partir de l’emplacement de police de FontFamily l’application. Dans cet exemple, 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 GetTypefaces méthode pour retourner la collection d’objets à partir de l’emplacement de police de Typeface l’application. Dans cet exemple, 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 seulement 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 pour découpler les ressources du code d’application qui les utilise. Cela permet également d’inclure l’assembly de bibliothèque 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’assembly de la référence dans l’assembly, utilisez un caractère « ; ». L’ajout du mot clé « Component » suivi de la référence au nom de la police complète la référence aux ressources de la bibliothèque de polices. L’exemple de code suivant indique comment référencer une police dans un assembly de bibliothèque de ressources.

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

Remarque

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 polices OpenType.

Limitations de 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 case activée ni n’appliquent aucun bits d’autorisation d’incorporation de police. Consultez la section Présentation de l’empaquetage de polices pour plus d’informations.

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

  • URI absolu utilisant le pack : notation : les applications WPF ne vous permettent pas de créer un FontFamily objet par programmation à l’aide de « pack : » dans le cadre de la référence d’identificateur de ressource uniforme (URI) absolue à une police. Par exemple, "pack://application:,,,/resources/#Pericles Light" il s’agit d’une référence de police non valide.

  • Incorporation de police automatique : Au moment de la conception, il n’est pas possible de rechercher les polices utilisées par une application et de les incorporer automatiquement 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.

  • En cas de référence incorrecte, l’application utilise une police disponible à la place.

Voir aussi