1

私の例では、 aと aFixedDocumentを使用して、wpf コンポーネントをシリアル化できることがわかりました。XamlWriterMemoryStream

FixedDocument doc = GetDocument();
MemoryStream stream = new MemoryStream();
XamlWriter.Save(doc, stream);

そして、それを取り戻すには:

stream.Seek(0, SeekOrigin.Begin);
FixedDocument result = (FixedDocument)XamlReader.Load(stream);
return result;

ただし、今は a もシリアル化できる必要がありDocumentPageます。XamlReader.Load呼び出しで例外をスローさせるデフォルトのコンストラクターがありません。

デフォルトのコンストラクターなしで wpf コンポーネントをシリアル化する方法はありますか?

4

1 に答える 1

1

ここに1つのテクニックがあります。

最初に、目的のクラスを構築できる MarkupExtension を作成します。非常に単純なものは次のようになります。

public class DocumentPageExtension : MarkupExtension
{
  public Visual Visual { get; set; }
  public Size PageSize { get; set; }
  public Rect BleedBox { get; set; }
  public Rect ContentBox { get; set; }

  public override object ProvideValue(IServiceProvider serviceProvider)
  {
    return new DocumentPage(Visual, PageSize, BleedBox, ContentBox);
  }
}

XamlWriter がドキュメントを書き込んだ後、"DocumentPage" を "my:DocumentPageExtension" に置き換え、ファイルの先頭に適切な名前空間宣言を追加します。

結果のファイルは、XamlReader.Load.

XamlWriter は、DocumentPage にあるような読み取り専用プロパティの値を格納しない可能性があります。(私はほとんどの場合、以前に書いた XamlWriter の代替品を使用します。) これらのプロパティをまったくシリアル化しない場合、ここで説明する手法を、それらのプロパティ値を最初に XAML に取得する別の方法で補う必要があります。場所。

また、この方法で処理する必要があるすべてのオブジェクトを「特別なケーシング」するのではなく、一般的なコンストラクター呼び出し MarkupExtension を作成できることにも注意してください。

于 2010-06-11T05:35:14.587 に答える