4

WPFアプリケーションのテーマエディターを作成しています。XAMLファイルを動的に生成してから、アプリケーションで使用されるDLLにコンパイルします。XAMLファイルの生成に使用されるコードは、次の行に沿っています。

var dictionary = new ResourceDictionary();
...

dictionary.Add(key, new BitmapImage { UriSource = new Uri(relativePath, UriKind.Relative) });
...

XamlWriter.Save(dictionary, "myDictionary.xaml");

私の問題は、プロパティXamlWriter.Saveもシリアル化することです。BaseUri

<BitmapImage BaseUri="{x:Null}" UriSource="Images\myImage.png" x:Key="myImage" />

その結果、アプリケーションがこの画像をフェッチしようとすると、が設定されていないため、画像が見つかりませんBaseUri。通常、XAMLパーサーはこのプロパティを(IUriContextインターフェイスを介して)設定しますが、XAMLで既に明示的に設定されている場合、パーサーはそれを設定しないため、nullのままになります。

プロパティのXamlWriterシリアル化を防ぐ方法はありますか?BaseUri

カスタムクラスをシリアル化する場合は、ShouldSerializeBaseUri()メソッドを追加するか、明示的に実装することができIUriContextます(両方のオプションを試したところ、目的の結果が得られました)が、どのように実行すればよいBitmapImageですか?

最後の手段として、XAMLファイルをロードし、Linq to XMLで属性を削除することもできましたが、よりクリーンなソリューションを望んでいました。

4

2 に答える 2

0

最終的に、Linq to XML を使用して手動で XAML を生成することで問題を解決しました。

于 2011-10-13T08:24:53.553 に答える
0

XamlWriterプロパティの書き込みを禁止する代わりに、BaseUri画像の読み込みに影響を与えないものを指定するとどうなるでしょうか? たとえば、次のコード:

<Image>
  <Image.Source>
    <BitmapImage UriSource="Resources/photo.JPG"/>
  </Image.Source>
</Image>

と同等のようです

<Image>
  <Image.Source>
    <BitmapImage BaseUri="pack://application:,," UriSource="Resources/photo.JPG"/>
  </Image.Source>
</Image>

試す

  dictionary.Add("Image", new BitmapImage{
    BaseUri=new Uri("pack://application:,,"),
    UriSource = new Uri(@"Images\myImage.png", UriKind.Relative)
  });

コードからこの方法で作成された BitmapImage に画像ソースを設定しようとしても、うまくいきません。ただしXamlWriter.Save()、XAML の場合に機能する XAML を生成します:)。まあ、試してみる価値はあると思います。

于 2011-07-04T04:29:48.853 に答える