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


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

Обновлен: Ноябрь 2007

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

ms753303.alert_note(ru-ru,VS.90).gifПримечание.

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

В этом разделе содержатся следующие подразделы.

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

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

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

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

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

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

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

<Project DefaultTargets="Build" xmlns="https://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="https://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Other project build settings ... -->

  <ItemGroup>
    <Resource Include="resources\Peric.ttf" />
    <Resource Include="resources\Pericl.ttf" />
  </ItemGroup>
</Project>
ms753303.alert_note(ru-ru,VS.90).gifПримечание.

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

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

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

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

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

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

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

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

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

foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new Uri("pack://application:,,,/"), "./resources/"))
{
    // Perform action.
}

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

foreach (Typeface typeface in Fonts.GetTypefaces(new Uri("pack://application:,,,/"), "./resources/"))
{
    // Perform action.
}

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

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

<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>
ms753303.alert_note(ru-ru,VS.90).gifПримечание.

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

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

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

  • биты разрешения внедрения шрифтов. Приложения WPF не проверяют и не выполняют принудительно биты разрешения внедрения шрифта. Дополнительные сведения см. в разделе Общие_сведения_об_упаковке_шрифтов;

  • шрифты узла источника. Приложения WPF не позволяют шрифту ссылаться на URI (uniform resource identifier — универсальный код ресурса) типа http или ftp;

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

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

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

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

См. также

Основные понятия

Возможности шрифта OpenType

Образец пакета шрифтов OpenType

Ссылки

Typography

FontFamily

Другие ресурсы

Microsoft Typography: ссылки, новости и контакты

Спецификация OpenType