В WPF, как я могу ссылаться на шрифт в библиотеке ресурсов в коде?
У меня есть приложение, которое использует отдельную сборку библиотеки для ресурсов (но не сборку только для ресурсов без кода), и я хотел бы добавить в библиотеку собственный шрифт.
Я могу получить шрифт, который является Open Type Font
, для загрузки, если я добавлю его .otf файл в качестве ресурса для проекта для исполняющей сборки (а не в проект библиотеки ресурсов), с установленными свойствами как Build Action = 'Resource' и Copy to Output = 'Do not Copy', используя следующий код:
FontFamily font = new FontFamily(new Uri("pack://application:,,,/"),
"./Resources/#CustomFont")); // Resources is a subfolder
Однако, когда я пытаюсь добавить шрифт в проект библиотеки ресурсов, шрифт не загружается. Я попытался использовать следующий код для его загрузки (также отметить: у меня нет большого опыта работы с URI пакета):
FontFamily font = new FontFamily(new Uri("pack://application:,,,/MyLibrary"),
"./Resources/#CustomFont"));
// there is a Resources subfolder in my library as well
// not sure about whether I need the .
Библиотека работает для других ресурсов, например изображений.
Я также пробовал кучу других перестановок для URI без успеха (он также не генерирует исключений, просто отображает шрифт по умолчанию, не уверен, что это отдельная проблема).
Я работаю из Упаковывать шрифты с приложениями в MSDN, в котором есть пример создания библиотеки ресурсов шрифта, но нет примеров с использованием кода (я вынуждены использовать код для этого).
Любые идеи о том, что мне нужно делать? Я не в курсе?
Ответы
Ответ 1
Я работаю в своем приложении (загружая шрифты из другой сборки в код). Для URI шрифта:
pack://application:,,,/MyAssembly.Name;component/Resources/Fonts/#Swis721 Md BT
Как я получил его на работу (после болезненных проб и ошибок, если я правильно помню):
new FontFamily(
new Uri("pack://application:,,,/MyAssembly.Name;component/Resources/Fonts/"),
"./#Swis721 Md BT"
)
Надеюсь, что это поможет.
Ответ 2
WPF не поддерживает создание объекта FontFamily программно с использованием нотации пакетов.
Документы говорят это в конце страницы, здесь
Вот цитата:
Абсолютный URI с использованием пакета: нотация: Приложения WPF не позволяют программно создавать объект FontFamily, используя "pack:" как часть ссылки на единый идентификатор ресурса (URI) на шрифт, Например, "pack://application:,,/resources/# Pericles Light" является недопустимой ссылкой на шрифт.
Ответ 3
(Я знаю, старый вопрос, но я не нашел правильного ответа.)
ответ Росса работает только в некоторых версиях netframework.
(Не работает на netframework 4.6)
Я думаю, что это лучший ответ:
Перечисление шрифтов в приложении:
foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new Uri("pack://application:,,,/"), "./resources/"))
{
// Perform action.
}
ссылка