Упаковка шрифтов с приложениями
Этот раздел содержит общие сведения об упаковке шрифтов с вашей Windows Presentation Foundation (WPF) приложения.
Note
Как и с большинством типов программного обеспечения, файлы шрифтов предоставляются по лицензии, а не продаются. Лицензии, регулирующие использование шрифтов, отличаются в зависимости от производителя, но в целом большинство лицензий, в том числе охватывающие шрифты, Майкрософт с приложениями и Windows, не допускают шрифтов, внедренных в приложениях или в противном случае распространение. Ответственность разработчика состоит в том, чтобы гарантировать наличие требуемых лицензионных прав на любой шрифт, встраиваемый в приложение или распространяемый иными путями.
Общие сведения об упаковке шрифтов
Можно легко упаковать шрифты в качестве ресурсов в вашей WPF приложения для отображения текста пользовательского интерфейса и других типов текста на основе содержимого. Шрифты могут быть отдельными от файлов сборки приложения или включенными в них. Можно также создать библиотеку шрифтов только для ресурсов, на которую может ссылаться приложение.
OpenType и TrueType® шрифты содержат флаг типа fsType, указывающее, права лицензирования на встраивание шрифта для шрифта. Однако этот флаг типа относится только к внедренным шрифтам, хранящимся в документе; он не относится к шрифтам, внедренным в приложении. Вы можете получить права для шрифта на внедрение путем создания GlyphTypeface и ссылки на его EmbeddingRights свойство. См. в разделе «OS/2 и Windows метрики» спецификация OpenType Дополнительные сведения о флаге fstype см.
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>
Note
При добавлении шрифтов как ресурсов в приложение, убедитесь, что при установке <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");
Базовый URI может включать подкаталог приложения, где находится ресурс шрифта. В этом случае ссылка на расположение шрифта не нужно указать каталог, но пришлось бы включить в начале префикс "./
«, указывает, что ресурс шрифта находится в том же каталоге, который указан с помощью базового URI. В следующем примере кода показан другой способ ссылки на элемент ресурса шрифта — он эквивалентен предыдущему примеру кода.
// 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>
Note
Этот пакет SDK содержит набор образцов OpenType шрифты, которые можно использовать с WPF приложений. Эти шрифты определяются в библиотеке ресурсов. Дополнительные сведения см. в разделе Пакет образцов шрифтов OpenType.
Ограничения в использовании шрифтов
Ниже приведены некоторые ограничения по упаковке и использованию шрифтов в WPF приложений:
Биты разрешений на внедрение шрифтов: WPF приложения не проверяют и не применяют принудительно никакие биты разрешений на внедрение шрифтов. См. в разделе ntroduction_to_packing Fonts Дополнительные сведения.
Сайт исходных шрифтов: WPF приложения не разрешают ссылка на шрифт для http или ftp URI.
Абсолютный URI, с помощью пакета: нотации: WPF приложения не разрешают создавать FontFamily программным способом с помощью «pack:» как часть абсолютное URI ссылки на шрифт. Например
"pack://application:,,,/resources/#Pericles Light"
является недопустимой ссылкой на шрифт.Автоматическое внедрение шрифтов. Во время разработки не поддерживается поиск шрифтов, используемых приложением, и автоматическое внедрение шрифтов в ресурсы приложения.
Подмножества шрифтов: WPF приложения не поддерживают создание подмножеств шрифтов для нефиксированных документов.
Если обнаруживается неправильная ссылка, приложение прибегает к использованию доступного шрифта.