Поделиться через


Упаковка шрифтов с помощью приложений

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

Заметка

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

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

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

Шрифты OpenType и TrueType® содержат флаг типа fsType, указывающий права лицензирования для шрифта. Однако этот флаг типа относится только к внедренным шрифтам, хранящимся в документе, но не относится к шрифтам, внедренным в приложение. Вы можете получить права внедрения шрифта, создав объект GlyphTypeface и ссылаясь на его свойство EmbeddingRights. Дополнительные сведения о флаге fsType см. в разделе "Метрики ОС/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 не проверяют и не применяют биты разрешения на встраивание шрифтов. См. раздел Введение_в_Упаковку Шрифтов для получения дополнительной информации.

  • Шрифты сайта происхождения: приложения WPF не допускают ссылку на шрифт по HTTP или FTP универсальному идентификатору ресурса (URI).

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

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

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

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

См. также