【问题标题】:Uri reference to ressource in assembly loaded on demand对按需加载的程序集中资源的 Uri 引用
【发布时间】:2011-03-13 09:46:42
【问题描述】:

我确实按需加载了一个包含资源(字体)的程序集。 程序集由 AssemblyPart 类加载, 并因此添加到当前应用程序域中。

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

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

字体未应用于文本,但我确实获得了资源流。

如果程序集在 inside xap 包中,一切正常, 但将其设置为复制本地 false 它不会显示正确的字体。 :(

我不能使用FontSource 将字体直接设置为流(我肯定有), 因为像RunParagraphRichTextBox 这样的类根本没有它们。 ;(

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

有没有已知的方法可以做到这一点?

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

亲切的问候

【问题讨论】:

    标签: silverlight fonts assemblies richtextbox ondemand


    【解决方案1】:

    考虑将您的主项目对了解字体的完整 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 类型的字段与库实现关联起来。

    【讨论】:

    • 嗨 Anthony,我按照你的方法试过了,但不幸的是结果是一样的。字体仍未应用。感谢您发布这个想法。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多