В 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.
            }

ссылка