Uri ссылка на ресурс в сборке, загруженной по требованию - PullRequest
2 голосов
/ 08 июля 2010

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

txt1.FontFamily = New FontFamily("/SilverlightFontLibrary;component/GRAFFITO_01.ttf#Graffito")

Dim kaa = Application.GetResourceStream("/SilverlightFontLibrary;component/GRAFFITO_01.ttf".ToUri(UriKind.Relative))

Шрифт не применяется к тексту, но я получаю поток ресурсов.

Если сборка внутри в пакете xap все работает нормально, но установив его для копирования локального false , он не покажет правильный шрифт. (

Я не могу использовать FontSource, чтобы установить шрифт непосредственно как поток (который у меня определенно есть), потому что классы типа Run, Paragraph или RichTextBox просто не имеют их. ; (

Кто-нибудь знает, может ли MEF (Microsoft Extensibility Framework) помочь мне в этом?

Есть ли какой-нибудь известный способ сделать это?

Мне серьезно нужно обратиться к этим ресурсам, но я не могу собрать их все в один пакет xap. (

С уважением

1 Ответ

0 голосов
/ 08 июля 2010

Рассмотрите возможность разделения зависимости вашего основного проекта от знания полного URL-адреса к шрифту. Вместо этого создайте интерфейс IFontProvider в третьем проекте, на который ссылаются оба ваших других проекта (извините за C #, я не использую VB.NET):

 public interface IFontProvider
 {
   FontFamily this[string name] {get; }
 } 

В вашей библиотеке шрифтов создайте такую ​​реализацию: -

public class FontProvider : IFontProvider
{
  public FontFamily this[string name]
  {
     get
     {
        switch (name)
        {
            case "Graffito": 
              return New FontFamily("/SilverlightFontLibrary;component/GRAFFITO_01.ttf#Graffito");
            default:
             return null;
        }
     }   
}

Загрузив сборку библиотеки в домен, вы сможете получить доступ к шрифту: -

Type providerType = Type.GetType("SilverlightFontLibrary.FontProvider, SilverlightFontLibrary");
IFontProvider fonts = Activator.CreateInstance(providerType) As IFontProvider;
txt1.FontFamily = fonts["Graffito"];

При использовании URL-адреса компонента из кода в одном и том же компоненте он сможет найти ресурс.

Есть несколько блогов по загрузке MEF и динамических сборок, поэтому вы можете использовать их динамически для подключения поля типа IFontProvider с реализацией библиотеки.

...