Упаковка шрифтов с приложениями

В данном разделе содержатся общие сведения об упаковке шрифтов с приложением Windows Presentation Foundation (WPF).

Примечание.

Как и с большинством типов программного обеспечения, файлы шрифтов предоставляются по лицензии, а не продаются. Лицензии, регулирующие использование шрифтов, отличаются в зависимости от производителя, но в целом большинство лицензий, в том числе охватывающие шрифты, предоставляемые Microsoft с приложениями и Microsoft, не позволяют встраивать шрифты в приложения или каким-либо иным образом распространять их. Ответственность разработчика состоит в том, чтобы гарантировать наличие требуемых лицензионных прав на любой шрифт, встраиваемый в приложение или распространяемый иными путями.

Общие сведения об упаковке шрифтов

Вы можете легко упаковать шрифты в качестве ресурсов в своих приложениях WPF для отображения текста пользовательского интерфейса и других типов текста на основе содержимого. Шрифты могут быть отдельными от файлов сборки приложения или включенными в них. Можно также создать библиотеку шрифтов только для ресурсов, на которую может ссылаться приложение.

Шрифты OpenType и TrueType® содержат флаг типа fsType, указывающий лицензионные права на внедрение шрифтов для этих шрифтов. Однако этот флаг типа относится только к внедренным шрифтам, хранящимся в документе; он не относится к шрифтам, внедренным в приложении. Можно получить права на встраивание шрифта для создания объекта GlyphTypeface и создания ссылки на ее свойство EmbeddingRights. Дополнительные сведения о флаге fsType см. в разделе «OS/2 и метрики Windows» статьи Спецификация OpenType.

На веб-сайте Microsoft Typography находится контактная информация, которая поможет вам найти поставщика определенного шрифта или поставщика шрифтов для создания специального шрифта.

Добавление шрифтов как элементов содержимого

Вы можете добавить шрифты в приложение в виде элементов содержимого проекта, которые отделены от файлов сборки приложения. Это означает, что элементы содержимого не внедряются в сборку в качестве ресурсов. В следующем примере файла проекта показано, как определить элементы содержимого.

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

Чтобы приложение могло использовать шрифты во время выполнения, эти шрифты должны быть доступны в каталоге развертывания приложения. Элемент <CopyToOutputDirectory> в файле проекта приложения позволяет автоматически копировать шрифты в каталог развертывания приложения в процессе сборки. В следующем примере файла проекта показано, как скопировать шрифты в каталог развертывания.

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

В следующем примере кода показано, как ссылаться на шрифт приложения как на элемент содержимого: ссылочный элемент содержимого должен быть в том же каталоге, что и файлы сборки приложения.

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

Добавление шрифтов как элементов ресурсов

Вы можете добавить шрифты в приложение в виде элементов ресурсов проекта, которые внедряются в файлы сборки приложения. Использование отдельного подкаталога для ресурсов помогает упорядочить файлы проекта приложения. В следующем примере файла проекта показано, как определить шрифты в виде элементов ресурсов в отдельном подкаталоге.

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

Примечание.

При добавлении шрифтов как ресурсов в приложение убедитесь, что устанавливаете в файле проекта приложения элемент <Resource>, а не элемент <EmbeddedResource>. Элемент <EmbeddedResource> не поддерживается для действия сборки.

В следующем примере разметки показано, как ссылаться на ресурсы шрифтов приложения.

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

Ссылка на элементы ресурсов шрифтов из кода

Чтобы ссылаться на элементы ресурсов шрифтов из кода, необходимо указать ссылку на ресурс шрифта, состоящую из двух частей: базового URI и ссылки на расположение шрифта. Эти значения используются в качестве параметров метода FontFamily. В следующем примере кода показано, как ссылаться на ресурсы шрифтов приложения в подкаталоге проекта с именем 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")

Базовый URI может включать подкаталог приложения, где находится ресурс шрифта. В этом случае в ссылке на расположение шрифта не нужно указать каталог, но необходимо включить в начале префикс «./», который указывает, что ресурс шрифта находится в том же каталоге, который указан с помощью базового URI. В следующем примере кода показан другой способ ссылки на элемент ресурса шрифта — он эквивалентен предыдущему примеру кода.

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

Ссылка на шрифты из одного подкаталога приложения

Вы можете разместить файл содержимого и файл ресурсов приложения в одном пользовательском подкаталоге проекта приложения. В следующем примере файла проекта показаны страница содержимого и ресурсы шрифтов, определенные в одном подкаталоге.

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

Поскольку содержимое приложения и шрифт находятся в одном подкаталоге, ссылка на шрифт указывается относительно содержимого приложения. В следующих примерах показывается, как ссылаться на ресурс шрифтов приложения, когда шрифт находится в том же каталоге, что и приложение.

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

Перечисление шрифтов в приложении

Для перечисления шрифтов как элементов ресурса в приложении используйте метод GetFontFamilies или GetTypefaces. В следующем примере показано, как использовать метод GetFontFamilies для возвращения коллекции объектов FontFamily из расположения шрифта приложения. В данном случае приложение содержит подкаталог с именем 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

В следующем примере показано, как использовать метод GetTypefaces для возвращения коллекции объектов Typeface из расположения шрифта приложения. В данном случае приложение содержит подкаталог с именем 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

Создание библиотеки ресурсов шрифтов

Вы можете создать библиотеку только для ресурсов, которая содержит только шрифты; в проекте библиотеки этого типа никакой код не включается. Создание библиотеки ресурсов является общим приемом для разделения ресурсов и использующего их кода приложения. Это также позволяет включать сборку библиотеки в несколько проектов приложений. В следующем примере файла проекта показаны основные части проекта библиотеки ресурсов.

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

Ссылка на шрифт в библиотеке ресурсов

Чтобы сослаться на шрифт в библиотеке ресурсов из приложения, необходимо добавить в ссылку на шрифт префикс с именем сборки библиотеки. В данном случае сборкой ресурсов шрифтов является FontLibrary. Для отделения имени сборки от ссылки в сборке используйте символ «;». Добавив ключевое слово Component и ссылку на имя шрифта, вы получите полную ссылку на ресурс библиотеки шрифтов. В следующем примере кода показано, как сослаться на шрифт в сборке библиотеки ресурсов.

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

Примечание.

Этот пакет SDK содержит набор образцов шрифтов OpenType, которые можно использовать с приложениями WPF. Эти шрифты определяются в библиотеке ресурсов. Дополнительные сведения см. в разделе Пакет образцов шрифтов OpenType.

Ограничения в использовании шрифтов

В следующем списке описываются некоторые ограничения по упаковке и использованию шрифтов в приложениях WPF.

  • Биты разрешений на внедрение шрифтов: приложения WPF не проверяют и не применяют принудительно никакие биты разрешений на внедрение шрифтов. Дополнительные сведения см. в разделе ntroduction_to_Packing Fonts.

  • Сайт исходных шрифтов: приложения WPF не разрешают ссылки на шрифт по URI ресурса http или ftp.

  • Абсолютный URI с помощью нотации pack: приложения WPF не разрешают создавать объект FontFamily программными средствами, используя pack: как часть ссылки на шрифт по абсолютному URI. Например, "pack://application:,,,/resources/#Pericles Light" является недопустимой ссылкой на шрифт.

  • Автоматическое внедрение шрифтов: во время разработки не поддерживается поиск шрифтов, используемых приложением, и их автоматическое внедрение в ресурсы приложения.

  • Подмножества шрифтов: приложения WPF не поддерживают создание подмножеств шрифтов для нефиксированных документов.

  • Если обнаруживается неправильная ссылка, приложение прибегает к использованию доступного шрифта.

См. также