Compartilhar via


Empacotando fontes com aplicativos

Este tópico fornece uma visão geral de como empacotar fontes com seu aplicativo Windows Presentation Foundation (WPF).

Observação

Assim como a maioria dos tipos de software, as fontes são licenciadas, ao invés de vendidas. As licenças que regem o uso de fontes variam de fornecedor para fornecedor, mas, em geral, a maioria das licenças, incluindo aquelas que abrangem as fontes que a Microsoft fornece com aplicativos e o Windows, não permite que as fontes sejam incorporadas em aplicativos ou redistribuídas de outra forma. Portanto, como desenvolvedor, é sua responsabilidade assegurar que você tenha os direitos de licença necessários de qualquer fonte que você inserir em um aplicativo ou redistribuir.

Introdução a empacotamento de fontes

Você pode facilmente empacotar fontes como recursos dentro de seus aplicativos WPF para exibir texto da interface do usuário e outros tipos de conteúdo baseado em texto. As fontes podem ser separadas ou inseridas nos arquivos de assembly do aplicativo. Você também pode criar uma biblioteca de fontes somente recursos, que seu aplicativo pode fazer referência.

As fontes OpenType e TrueType® contêm um sinalizador de tipo, fsType, que indica direitos de licenciamento de incorporação de fonte para a fonte. No entanto, esse sinalizador de tipo somente referencia fontes embutidas armazenadas em um documento. Ele não referencia fontes incorporadas em um aplicativo. Você pode recuperar os direitos de incorporação de fonte para uma fonte criando um GlyphTypeface objeto e fazendo referência à sua EmbeddingRights propriedade. Consulte a seção "Métricas do Windows e OS/2" da Especificação OpenType para obter mais informações sobre o sinalizador fsType.

O site Microsoft Typography inclui informações que podem ajudar a localizar um determinado fornecedor de fonte ou encontrar um fornecedor de fonte para um trabalho personalizado.

Adicionando fontes como itens de conteúdo

Você pode adicionar fontes ao seu aplicativo como itens de conteúdo de projeto que são separados dos arquivos de assembly do aplicativo. Isso significa que os itens de conteúdo não são inseridos como recursos em um assembly. O seguinte exemplo de arquivo de projeto mostra como definir itens de conteúdo.

<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>  

Para garantir que o aplicativo possa usar as fontes em tempo de execução, as fontes devem ser acessíveis no diretório de implantação do aplicativo. O <CopyToOutputDirectory> elemento no arquivo de projeto do aplicativo permite que você copie automaticamente as fontes para o diretório de implantação do aplicativo durante o processo de compilação. O seguinte exemplo de arquivo de projeto mostra como copiar fontes para o diretório de implantação.

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

O exemplo de código a seguir mostra como referenciar a fonte do aplicativo como um item de conteúdo. O item de conteúdo referenciado deve estar no mesmo diretório que os arquivos de assembly do aplicativo.

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

Adicionando fontes como itens de recurso

Você pode adicionar fontes ao seu aplicativo como itens de recurso de projeto que são inseridos nos arquivos de assembly do aplicativo. Usar um subdiretório separado para recursos ajuda a organizar arquivos de projeto do aplicativo. O seguinte exemplo de arquivo de projeto mostra como definir fontes como itens de recursos em um subdiretório separado.

<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>  

Observação

Quando você adiciona fontes como recursos ao seu aplicativo, verifique se você está definindo o elemento e não o <Resource><EmbeddedResource> elemento no arquivo de projeto do aplicativo. Não <EmbeddedResource> há suporte para o elemento para a ação de compilação.

O exemplo de marcação a seguir mostra como referenciar os recursos de fonte do aplicativo.

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

Referenciando itens de recurso de fonte do código

Para fazer referência a itens de recurso de fonte a partir do código, você deve fornecer uma referência de recurso de fonte de duas partes: o URI (identificador uniforme de recursos) base; e a referência de localização da fonte. Esses valores são usados como parâmetros para o FontFamily método. O exemplo de código a seguir mostra como referenciar os recursos de fonte do aplicativo no subdiretório do projeto chamado 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")

O URI (identificador uniforme de recurso) base pode incluir o subdiretório do aplicativo onde reside o recurso de fonte. Nesse caso, a referência de local da fonte não precisaria especificar um diretório, mas teria que incluir um "./", à esquerda, que indica que o recurso de fonte está no mesmo diretório especificado pelo URI (identificador uniforme de recursos) base. O exemplo de código a seguir mostra uma maneira alternativa de referenciar o item de recurso de fonte. Ele é equivalente ao exemplo de código anterior.

// 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")

Referenciando fontes do mesmo subdiretório do aplicativo

Você pode colocar ambos os arquivos de conteúdo e recursos de aplicativo dentro do mesmo subdiretório definido pelo usuário do seu projeto de aplicativo. O seguinte exemplo de arquivo de projeto mostra uma página de conteúdo e recursos de fonte definidos no mesmo subdiretório.

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

Como o conteúdo do aplicativo e a fonte estão no mesmo subdiretório, a referência da fonte é relativa ao conteúdo do aplicativo. Os exemplos a seguir mostram como referenciar o recurso de fonte do aplicativo quando a fonte está no mesmo diretório do aplicativo.

<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")

Enumerando fontes em um aplicativo

Para enumerar fontes como itens de recurso em seu aplicativo, use o GetFontFamilies método ou GetTypefaces . O exemplo a seguir mostra como usar o GetFontFamilies método para retornar a coleção de objetos do local da FontFamily fonte do aplicativo. Nesse caso, o aplicativo contém um subdiretório chamado "recursos".

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

O exemplo a seguir mostra como usar o GetTypefaces método para retornar a coleção de objetos do local da Typeface fonte do aplicativo. Nesse caso, o aplicativo contém um subdiretório chamado "recursos".

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

Criando uma biblioteca de recursos de fonte

Você pode criar uma biblioteca somente recursos que contém apenas fontes. Nenhum código faz parte desse tipo de projeto de biblioteca. Criar uma biblioteca somente recursos é uma técnica comum para desacoplar recursos do código do aplicativo que os utiliza. Isso também permite que o assembly de biblioteca seja incluído em vários projetos de aplicativo. O seguinte exemplo de arquivo de projeto mostra as partes principais de um projeto de biblioteca somente recursos.

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

Referenciando uma fonte em uma biblioteca de recursos

Para referenciar uma fonte em uma biblioteca de recursos de seu aplicativo, você deve prefixar a referência da fonte com o nome do assembly de biblioteca. Nesse caso, o assembly de recursos de fonte é "FontLibrary". Para separar o nome do assembly de referência dentro do assembly, use um caractere ';'. Adicionar a palavra-chave "Component" seguida da referência ao nome da fonte completa a referência completa ao recurso da biblioteca de fontes. O exemplo de código a seguir mostra como referenciar uma fonte em um assembly de biblioteca de recursos.

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

Observação

Este SDK contém um conjunto de fontes OpenType de exemplo que você pode usar com aplicativos WPF. As fontes são definidas em uma biblioteca somente recursos. Para obter mais informações, consulte Pacote de fontes OpenType de exemplo.

Limitações no uso de fontes

A lista a seguir descreve várias limitações no empacotamento e uso de fontes em aplicativos WPF:

  • Bits de permissão de incorporação de fonte: os aplicativos WPF não verificam ou impõem nenhum bit de permissão de incorporação de fonte. Consulte a seção Introdução ao empacotamento de fontes para obter mais informações.

  • Fontes do site de origem: os aplicativos WPF não permitem uma referência de fonte a um URI (identificador uniforme de recursos) http ou ftp.

  • URI absoluto usando a notação pack:: aplicativos WPF não permitem que você crie um FontFamily objeto programaticamente usando "pack:" como parte da referência URI (identificador uniforme de recursos) absoluto para uma fonte. Por exemplo, "pack://application:,,,/resources/#Pericles Light" é uma referência de fonte inválida.

  • Incorporação de fonte automática: no tempo de design, não há suporte para pesquisar o uso de um aplicativo de fontes e incorporar automaticamente as fontes nos recursos do aplicativo.

  • Subconjuntos de fontes: os aplicativos WPF não oferecem suporte à criação de subconjuntos de fontes para documentos não fixos.

  • Em casos em que há uma referência incorreta, o aplicativo volta a usar uma fonte disponível.

Confira também