2011-11-07 6 views
4

Controlのスナップショットを取得して1つのFixedDocumentに格納する必要があります。問題は、VisualBrushは何とか「怠け者」であり、それをドキュメントに追加することで評価しないということです。最終的にドキュメントを作成すると、すべてのページに同じ(最後の)コントロールの状態が含まれます。 VisualBrushはフリーズすることはできませんが、それを行うチャンスはありますか? 1ページにスナップショットを追加したいので、ページごとにドキュメントを生成することは私にとって解決策ではありません。 VisualBrushをビットマップに変換するAswel(私はベクトルでそれを保持したい)。要するに - I need to somehow Freeze() VisualBrush1つの固定(フロー)ドキュメントに格納されたVisualBrushを使用したスナップショット

for(;;) 
{ 
    FixedPage page = new FixedPage(); 
    ... 
    Rectangle rec = new Rectangle(); 
    ... 
    rec.Fill = vb; 
    page.Children.Add(rec); 
    PageContent content = new PageContent(); 
    ((IAddChild)content).AddChild(page); 
    doc.Pages.Add(content); 
} 

答えて

3

私は、シリアル化を使用:

string svb = XamlWriter.Save(vb.CloneCurrentValue()); 
// Replace all "Name" attributes (I don't need them already and deserialization would crash on them) with "Tag" - not best practice but it's fast :) 
svb = svb.Replace("Name", "Tag"); 
rect.Fill((VisualBrush)XamlReader.Parse(svb)); 

EDIT

良い方法はXPSドキュメントとしてビジュアル保存し、Visualバックを取ることです。 (De)シリアライゼーションには、SharedSizeGroupsや他の多くの「参照のような」ものにいくつかの問題があります。

XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc); 
control.InvalidateArrange(); 
UpdateLayout(); 
writer.Write(control); 
Visual capture = doc.GetFixedDocumentSequence().DocumentPaginator.GetPage(0).Visual; 
+0

私はそれを使用しますが非常にゆっくりです。 – lindexi