Упаковка шрифтов с приложениями
В этом разделе представлены общие сведения по упаковыванию шрифтов с приложением Windows Presentation Foundation (WPF).
Примечание |
---|
Как и для большинства типов программного обеспечения, файлы шрифтов подлежат лицензированию, а не продаже.Лицензии, регулирующие использование шрифтов, отличаются в зависимости от производителя, но в целом большинство лицензий, в том числе покрывающие ресурсы шрифтов 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>
Примечание |
---|
При добавлении в приложение шрифтов в качестве ресурсов, убедитесь, что в данном файле проекта приложения задается элемент <Resource>, а не элемент <EmbeddedResource>.Элемент <EmbeddedResource> для действия построения не поддерживается. |
В следующем примере разметки демонстрируется создание ссылки на ресурсы шрифта приложения.
<TextBlock FontFamily="./resources/#Pericles Light">
Aegean Sea
</TextBlock>
Создание ссылок на элементы ресурса шрифта из кода
Чтобы из кода ссылаться на элементы ресурса шрифта, необходимо указать ссылку на ресурс шрифта, состоящую из двух частей: базового uniform resource identifier (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");
Базовый uniform resource identifier (URI) может включать подкаталог приложения, где постоянно хранится ресурс шрифта. В этом случае ссылка на размещение шрифта не требует указания каталога, но должна иметь в начале пути символ "./", который показывает, что ресурс шрифта находится в том же каталоге, что указан с помощью базового uniform resource identifier (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.
For Each fontFamily As FontFamily In Fonts.GetFontFamilies(New Uri("pack://application:,,,/"), "./resources/")
' Perform action.
Next fontFamily
foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new Uri("pack://application:,,,/"), "./resources/"))
{
// Perform action.
}
В следующем примере показано использование метода GetTypefaces для возврата коллекции объектов Typeface из папки, в которой размещается шрифт приложения. В этом случае приложение содержит подкаталог с именем resources.
For Each typeface As Typeface In Fonts.GetTypefaces(New Uri("pack://application:,,,/"), "./resources/")
' Perform action.
Next typeface
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>
Примечание |
---|
Этот набор SDK содержит набор образцов шрифтов OpenType, которые можно использовать с приложениями WPF.Шрифты определяются в библиотеке ресурса.Дополнительные сведения см. в разделе Образец пакета шрифтов OpenType. |
Ограничения в использовании шрифта
В списке ниже приведены некоторые ограничения по упаковке и использованию шрифтов в приложениях WPF:
биты разрешения внедрения шрифтов. Приложения WPF не проверяют и не выполняют принудительно биты разрешения внедрения шрифта. Дополнительные сведения см. в разделе Общие_сведения_об_упаковке_шрифтов;
шрифты узла источника. Приложения WPF не позволяют шрифту ссылаться на uniform resource identifier (URI) типа http или ftp;
абсолютный URI, использующий нотацию pack:. Приложения WPF не позволяют программно создавать объект FontFamily, используя нотацию "pack:" в качестве части ссылки на шрифт в виде абсолютного uniform resource identifier (URI). Например, "pack://application:,,,/resources/#Pericles Light" является недопустимой ссылкой на шрифт;
автоматическое внедрение шрифтов. Во время разработки не поддерживается поиск и использование шрифтов приложением, а также автоматическое внедрение шрифтов в ресурсы приложения;
подмножества шрифтов. Приложения WPF не поддерживают создание подмножеств шрифта для нефиксированных документов.
При наличии неправильной ссылки приложение возвращается к использованию доступного шрифта.
См. также
Ссылки
Основные понятия
Образец пакета шрифтов OpenType