Uri引用按需加载的程序集中的资源

时间:2010-07-08 15:00:30

标签: silverlight fonts assemblies richtextbox ondemand

我按需加载程序集,其中包含ressources(字体)。 程序集由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直接将字体设置为流(我肯定拥有), 因为像RunParagraphRichTextBox这样的课程根本没有它们。 ;(

有人知道MEF(Microsoft可扩展性框架)能否帮助我解决这个问题?

有没有任何已知的方法可以实现这一目标?

我非常需要参考这些资源,但不能将它们全部放到一个xap包中。 :(

亲切的问候

1 个答案:

答案 0 :(得分:0)

考虑将主项目的依赖性解除对知道字体的完整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"];

使用“组件”网址从同一组件中的代码中使用它应该能够找到资源。

有一些关于MEF和动态程序集加载的博客,因此您可以使用它动态地将类型IFontProvider的字段与库实现连接起来。