Empaquetar fuentes con aplicaciones

En este tema se proporciona información general sobre cómo empaquetar fuentes con la aplicación Windows Presentation Foundation (WPF).

Nota:

Como con la mayoría de los tipos de software, los archivos de fuentes se otorgan bajo licencia, no se venden. Las licencias que rigen el uso de las fuentes varían según el proveedor de que se trate pero, por lo general, la mayoría de las licencias, incluidas las proporcionadas por Microsoft con aplicaciones y Windows, no permiten incrustar las fuentes dentro de aplicaciones ni redistribuirlas de ningún otro modo. Así pues, como programador, su responsabilidad es asegurarse de disponer de los derechos de licencia necesarios para cualquier fuente que incruste en una aplicación o redistribuya de cualquier otro modo.

Introducción al empaquetado de fuentes

Puede empaquetar fuentes fácilmente como recursos dentro de las aplicaciones WPF para mostrar el texto de la interfaz de usuario y otros tipos de texto según el contenido. Las fuentes pueden ser independientes de los archivos de ensamblado de la aplicación o incrustadas en dichos archivos. También puede crear una biblioteca de fuentes solo de recursos, a la que puede hacer referencia la aplicación.

Las fuentes OpenType y TrueType® contienen una marca de tipo, fsType, que indica los derechos de licencia de incrustación de fuentes de la fuente. Sin embargo, este tipo de marca solo hace referencia a fuentes incrustadas almacenadas en un documento: no hace referencia a fuentes incrustadas en una aplicación. Puede recuperar los derechos de incrustación de fuente creando un objeto GlyphTypeface y haciendo referencia a su propiedad EmbeddingRights. Consulte la sección "OS/2 and Windows Metrics" (Métricas de OS/2 y Windows) de la especificación OpenType para obtener más información sobre la marca fsType.

El sitio web Microsoft Typography (Tipografía de Microsoft) incluye información de contacto que puede ayudarle a encontrar un proveedor de fuentes determinado o un proveedor de fuentes para trabajos personalizados.

Agregar fuentes como elementos de contenido

Puede agregar las fuentes a la aplicación como elementos de contenido del proyecto independientes de los archivos de ensamblado de la aplicación. Esto significa que los elementos de contenido no se incrustan como recursos en un ensamblado. En el siguiente ejemplo de archivo de proyecto se muestra cómo definir elementos de contenido.

<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 asegurarse de que la aplicación puede usar las fuentes en tiempo de ejecución, las fuentes deben ser accesibles en el directorio de implementación de la aplicación. El elemento <CopyToOutputDirectory> del archivo de proyecto de la aplicación le permite copiar automáticamente las fuentes en el directorio de implementación de la aplicación durante el proceso de compilación. En el siguiente ejemplo de archivo de proyecto se muestra cómo copiar las fuentes en el directorio de implementación.

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

En el ejemplo de código siguiente se muestra cómo hacer referencia a la fuente de la aplicación como un elemento de contenido: el elemento de contenido al que se hace referencia debe estar en el mismo directorio que los archivos de ensamblado de la aplicación.

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

Agregar fuentes como elementos de recursos

Puede agregar fuentes a la aplicación como elementos de recursos del proyecto incrustados dentro de los archivos de ensamblado de la aplicación. Usar un subdirectorio independiente para los recursos ayuda a organizar los archivos de proyecto de la aplicación. En el siguiente ejemplo de archivo de proyecto se muestra cómo definir las fuentes como elementos de recursos en un subdirectorio independiente.

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

Al agregar fuentes como recursos en la aplicación, asegúrese de que está configurando el elemento <Resource> y no el elemento <EmbeddedResource> del archivo de proyecto de la aplicación. El elemento <EmbeddedResource> no se admite para la acción de compilación.

En el ejemplo de marcado siguiente se muestra cómo hacer referencia a los recursos de fuentes de la aplicación.

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

Hacer referencia a elementos de recursos de fuentes desde el código

Para hacer referencia a elementos de recursos de fuentes desde el código, debe proporcionar una referencia de recursos de fuentes de dos partes: el identificador uniforme de recursos (URI) base; y la referencia de ubicación de la fuente. Estos valores se utilizan como parámetros para el método FontFamily. En el ejemplo de código siguiente se muestra cómo hacer referencia a los recursos de fuentes de la aplicación en el subdirectorio de proyecto llamado 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")

El identificador uniforme de recursos (URI) base puede incluir el subdirectorio de la aplicación donde esté el recurso de fuentes. En este caso, la referencia a la ubicación de la fuente no necesitaría especificar un directorio, pero tendría que incluir un "./" inicial, que indica que el recurso de la fuente está en el mismo directorio especificado por el identificador uniforme de recursos (URI) base. En el ejemplo de código siguiente se muestra una manera alternativa de hacer referencia al elemento de recursos de fuentes: es equivalente al ejemplo 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")

Hacer referencia a fuentes desde el mismo subdirectorio de aplicación

Puede colocar archivos de contenido y de recursos de aplicación dentro del mismo subdirectorio definido por el usuario del proyecto de la aplicación. En el siguiente ejemplo de archivo de proyecto se muestra una página de contenido y recursos de fuentes definidos en el mismo subdirectorio.

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

Puesto que el contenido de la aplicación y la fuente están en el mismo subdirectorio, la referencia de fuentes está relacionada con el contenido de la aplicación. En los ejemplos siguientes se muestra cómo hacer referencia a recursos de fuentes de la aplicación cuando la fuente está en el mismo directorio que la aplicación.

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

Enumerar fuentes en una aplicación

Para enumerar las fuentes como elementos de recursos en su aplicación, utilice el método GetFontFamilies o GetTypefaces. El siguiente ejemplo muestra cómo utilizar el método GetFontFamilies para devolver la colección de objetos FontFamily de la ubicación de la fuente de la aplicación. En este caso, la aplicación contiene un subdirectorio llamado "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

El siguiente ejemplo muestra cómo utilizar el método GetTypefaces para devolver la colección de objetos Typeface de la ubicación de la fuente de la aplicación. En este caso, la aplicación contiene un subdirectorio llamado "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

Crear una biblioteca de recursos de fuentes

Puede crear una biblioteca solo de recursos que contenga solo fuentes: ningún código forma parte de este tipo de proyecto de biblioteca. Crear una biblioteca solo de recursos es una técnica común para desacoplar los recursos del código de aplicación que los usa. Esto también permite que el ensamblado de biblioteca se incluya con varios proyectos de aplicación. En el siguiente ejemplo de archivo de proyecto se muestran las partes clave de un proyecto de biblioteca solo de recursos.

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

Hacer referencia a una fuente en una biblioteca de recursos

Para hacer referencia a una fuente en una biblioteca de recursos de la aplicación, debe anteponer la referencia de la fuente con el nombre del ensamblado de la biblioteca. En este caso, el ensamblado de recursos de fuentes es "FontLibrary". Para separar el nombre del ensamblado de la referencia dentro del ensamblado, use un carácter ";". Agregar la palabra clave "Component" seguida de la referencia al nombre de la fuente completa toda la referencia en el recurso de la biblioteca de fuentes. En el ejemplo de código siguiente se muestra cómo hacer referencia a una fuente en un ensamblado de biblioteca de recursos.

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

Nota:

Este SDK contiene un conjunto de fuentes OpenType de muestra que puede utilizar con aplicaciones WPF. Las fuentes se definen en una biblioteca solo de recursos. Para obtener más información, vea Paquete de fuentes OpenType de ejemplo.

Limitaciones de uso de fuentes

En la siguiente lista se describen varias limitaciones sobre el empaquetado y el uso de fuentes en aplicaciones WPF:

  • Bits de permisos de incrustación de fuentes: las aplicaciones WPF no comprueban ni exigen ningún bit de permisos de incrustación de fuentes. Consulte la sección Introducción al empaquetado de fuentes para obtener más información.

  • Sitio de fuentes de origen: las aplicaciones WPF no permiten una referencia de fuente a un identificador de recurso uniforme (URI) http o ftp.

  • URI absoluto que usa el paquete: notación: las aplicaciones WPF no le permiten crear ningún objeto FontFamily mediante programación a través del objeto "pack:" como parte de la referencia de identificador de recurso uniforme (URI) absoluto a una fuente. Por ejemplo, "pack://application:,,,/resources/#Pericles Light" es una referencia de fuente no válida.

  • Incrustación de fuentes automática: durante el tiempo de diseño, no hay ninguna compatibilidad para buscar el uso de fuentes de la aplicación ni para incrustar fuentes automáticamente en los recursos de la aplicación.

  • Subconjuntos de fuentes: las aplicaciones WPF no admiten la creación de subconjuntos de fuentes para documentos no fijos.

  • En casos donde hay una referencia incorrecta, la aplicación vuelve a usar una fuente disponible.

Vea también