2012-05-09 3 views
11

У меня есть приложение, которое использует отдельную сборку библиотеки для ресурсов (но не для сборки только ресурсов, без кода), и я хотел бы добавить в библиотеку собственный шрифт.В WPF, как я могу ссылаться на шрифт в библиотеке ресурсов в коде позади?

Я могу получить шрифт, который является Open Type Font, для загрузки, если я добавлю его .otf-файл в качестве ресурса для проекта для исполняющей сборки (а не в проект библиотеки ресурсов) со свойствами, заданными как построить Действие = «Ресурс» и скопировать на выход = «не копировать», используя следующий код:

FontFamily font = new FontFamily(new Uri("pack://application:,,,/"), 
         "./Resources/#CustomFont")); // Resources is a subfolder 

Когда я пытаюсь добавить шрифт в проект библиотеки ресурсов, однако, шрифт не загружается , Я попытался, используя следующий код, чтобы загрузить его (также отметить: у меня нет большого опыта работы с колодой URIs):

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 без каких-либо успехов (он также не генерирует исключений, просто отображает шрифт по умолчанию, не уверен, что это отдельная проблема).

Я работал с Packaging Fonts with Applications на MSDN, где есть пример создания библиотеки ресурсов шрифтов, но примеров с использованием кода нет (я вынужден использовать код для этого).

Любые идеи о том, что мне нужно сделать? Я не в курсе?

ответ

15

У меня есть работающий в моем приложении (загрузка шрифтов с другой сборки в коде). Для шрифта 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" 
) 

Надежда, что помогает.

+0

Это не работает для меня, что предполагает у меня есть какой-то другой потому что он работает на вас. – Pysul

+0

Спасибо, для меня это сработало ... спас мне много проб и ошибок! – yvesonline

+0

Я могу подтвердить, что он отлично работает, и прежде, чем я попробовал слишком много комбинаций загрузки без успеха !!! Я думал, что относительный доступ к ресурсам из dll будет достаточным, но, видимо, добавление имени сборки требуется, даже если шрифты должны быть доступны из одной и той же сборки! – too

1

WPF не поддерживает создание объекта FontFamily программно с использованием нотации пакета.

Документов сказать, что в конце страницы, here

Вот цитата:

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

+0

Так почему это работает для некоторых людей? – IneedHelp

+0

Ну, не глядя на код, я даже не мог понять. Но документы говорят, что нет. Я бы сказал, что документам нужно доверять :) – Ninglin

+0

Я имею в виду, что ребята в сообщении выше говорят, что им удалось заставить его работать, но вы правы, документация обладает большей достоверностью. – IneedHelp

0

(я знаю, старый вопрос, но я не нашел правильный ответ.)

ответ Росс работает только в некоторых версиях NetFramework. (Не работает на сетке 4.6)

Я думаю, что это лучший ответ:

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

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

reference