Compartilhar via


Empacotando fontes com aplicativos

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

Nota

Assim como acontece com a maioria dos tipos de software, os arquivos de fonte são licenciados, em vez de vendidos. 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 fornecidas pela Microsoft com aplicativos e Windows, não permitem que as fontes sejam inseridas em aplicativos ou redistribuídas de outra forma. Portanto, como desenvolvedor, é sua responsabilidade garantir que você tenha os direitos de licença necessários para qualquer fonte inserida em um aplicativo ou redistribuir de outra forma.

Introdução ao pacote de fontes

Você pode facilmente empacotar fontes como recursos em seus aplicativos do WPF para exibir o 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 exclusiva de recursos, que seu aplicativo pode referenciar.

As fontes OpenType e TrueType® contêm um sinalizador de tipo, fsType, que indica direitos de licenciamento de inserção de fonte para a fonte. No entanto, esse sinalizador de tipo refere-se apenas a fontes inseridas armazenadas em um documento– ele não se refere a fontes inseridas em um aplicativo. Você pode recuperar os direitos de inserção de fonte para uma fonte criando um objeto GlyphTypeface e referenciando sua propriedade EmbeddingRights. Consulte a seção "OS/2 e Windows Metrics" da Especificação OpenType para obter mais informações sobre o flag fsType.

O site Microsoft Typography inclui informações de contato que podem ajudá-lo a localizar um fornecedor de fonte específico ou encontrar um fornecedor de fontes para trabalho personalizado.

Adicionando fontes como itens de conteúdo

Você pode adicionar fontes ao aplicativo como itens de conteúdo do projeto separados dos arquivos de assembly do aplicativo. Isso significa que os itens de conteúdo não são inseridos como recursos em uma assemblagem. O exemplo de arquivo de projeto a seguir 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 estar acessíveis no diretório de implantação do aplicativo. O elemento <CopyToOutputDirectory> 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 build. O exemplo de arquivo de projeto a seguir 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 aplicativo como itens de recurso de projeto inseridos nos arquivos de assembly do aplicativo. O uso de um subdiretório separado para recursos ajuda a organizar os arquivos de projeto do aplicativo. O exemplo de arquivo de projeto a seguir mostra como definir fontes como itens de recurso 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>  

Nota

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

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 a partir do código

Para fazer referência a itens de recurso de fonte do código, você deve fornecer uma referência de recurso de fonte de duas partes: o URI (identificador de recurso uniforme) base; e a referência de local da fonte. Esses valores são usados como parâmetros para o método FontFamily. 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 de recurso uniforme) base pode incluir o subdiretório do aplicativo no qual o recurso de fonte reside. Nesse caso, a referência de local da fonte não precisaria especificar um diretório, mas teria que incluir um prefixo "./", que indica que o recurso de fonte está no mesmo diretório especificado pelo URI (identificador de recurso uniforme) base. O exemplo de código a seguir mostra uma maneira alternativa de referenciar o item de recurso de fonte, que é 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 de aplicativo

Você pode colocar o conteúdo do aplicativo e os arquivos de recurso no mesmo subdiretório definido pelo usuário do seu projeto de aplicativo. O exemplo de arquivo de projeto a seguir 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 e a fonte do aplicativo estão no mesmo subdiretório, a referência de fonte é relativa ao conteúdo do aplicativo. Os exemplos a seguir mostram como referenciar o recurso de fonte do aplicativo quando a fonte estiver no mesmo diretório que o 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 método GetFontFamilies ou GetTypefaces. O exemplo a seguir mostra como usar o método GetFontFamilies para retornar a coleção de objetos FontFamily do local da 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 método GetTypefaces para retornar a coleção de objetos Typeface do local da 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 de recursos que contém apenas fontes— nenhum código faz parte desse tipo de projeto de biblioteca. A criação de uma biblioteca somente de recursos é uma técnica comum para desassociar recursos do código do aplicativo que os usa. Isso também permite que o assembly da biblioteca seja incluído com vários projetos de aplicativo. O exemplo de arquivo de projeto a seguir mostra as principais partes de um projeto de biblioteca de 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 fazer referência a uma fonte em uma biblioteca de recursos do aplicativo, você deve prefixar a referência de fonte com o nome do assembly da biblioteca. Nesse caso, o conjunto de recursos de fonte é "FontLibrary". Para separar o nome do assembly da referência dentro dele, use um caractere ';'. A adição da palavra-chave "Componente" seguida pela referência ao nome da fonte conclui 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>

Nota

Esse 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 de recursos. Para obter mais informações, consulte exemplo de pacote de fontes OpenType.

Limitações no uso de fontes

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

  • bits de permissão de inserção de fontes: aplicativos WPF não verificam nem impõem nenhum bit de permissão de inserção de fonte. Consulte a seção Introdução ao Empacotamento de Fontes para obter mais informações.

  • Site de fontes de origem: aplicativos WPF não permitem uma referência de fonte a um URI (identificador de recurso uniforme) http ou ftp.

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

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

  • Subconjuntos de fonte: aplicativos WPF não dão suporte à criação de subconjuntos de fonte para documentos não fixos.

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

Consulte também