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 パッケージ内にある場合、すべて正常に動作しますが、copy local falseに設定すると、正しいフォントが表示されません。:(

や のようなクラスには単にそれらがないため、 を使用しFontSourceてフォントをストリームとして直接設定することはできません (これは間違いなく持っています) 。;(RunParagraphRichTextBox

MEF (Microsoft Extensibility Framework) がこれから私を助けてくれるかどうか知っている人はいますか?

それを達成するための既知の方法はありますか?

これらのリソースを真剣に参照する必要がありますが、それらすべてを 1 つの xap パッケージに入れることはできません。:(

敬具

4

1 に答える 1

0

フォントへの完全な URL を知ることへのメイン プロジェクトの依存関係を切り離すことを検討してください。代わりにIFontProvider、他の両方のプロジェクトから参照される 3 番目のプロジェクトにインターフェイスを作成します (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 を使用すると、リソースを見つけることができるはずです。

IFontProviderMEF と動的アセンブリの読み込みに関するブログがいくつかあるので、それを使用して、型のフィールドをライブラリ実装と動的に関連付けることができる場合があります。

于 2010-07-08T15:59:10.407 に答える