2

我确实按需加载了一个程序集,其中包含资源(字体)。程序集由 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 可扩展性框架)是否可以帮助我解决这个问题?

有什么已知的方法可以做到这一点吗?

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

亲切的问候

4

1 回答 1

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"];

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

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

于 2010-07-08T15:59:10.407 回答