4

.NET 4のWPFで簡単なレポートおよび印刷システムを構築しようとしていますが、SOとさまざまなオンラインチュートリアルを数え切れないほどトロールした後、レポートテンプレートを含むフロードキュメントを取得することになっている次の(簡略化された)セットアップがあります。データソースをdatacontextとして追加し、ページネーションを行って、表示/印刷できるものに仕上げます。

レポートは、別のコンテンツファイル(DefaultReport.xaml)のフロードキュメントに配置されます。

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Paragraph FontFamily="Arial">
        <Run Text="1"/>        
        <Run Text="{Binding Path=MyText}"/>
        <Run Text="3"/>        
    </Paragraph>
</FlowDocument>

datacontextは単純なオブジェクトです。

private class MyDataContext {
    public string MyText { get; set; }
}

これは次のようにロードされ、まとめられます。

using (var stream = File.OpenRead("DefaultReport.xaml")) {
    FlowDocument document = (FlowDocument)XamlReader.Load(stream);                
    document.DataContext = new MyDataContext { MyText = "2" };

    flowReader.Document = document;           

    XpsDocument xpsDoc = LoadAsXPS(((IDocumentPaginatorSource)document).DocumentPaginator);
    fixedReader.Document = xpsDoc.GetFixedDocumentSequence();
    xpsDoc.Close();
}

LoadAsXPSは、フロードキュメントを次のようにXpsDocumentに変換します。

public XpsDocument LoadAsXPS(DocumentPaginator paginator) {
     MemoryStream stream = new MemoryStream();
     Package docPackage = Package.Open(stream, FileMode.Create, FileAccess.ReadWrite);

     Uri uri = new Uri(@"memorystream://myXps.xps");
     PackageStore.AddPackage(uri, docPackage);
     XpsDocument xpsDoc = new XpsDocument(docPackage);

     xpsDoc.Uri = uri;
     XpsDocument.CreateXpsDocumentWriter(xpsDoc).Write(paginator);

     return xpsDoc;
 }

flowReaderとfixedReaderは、操作全体の結果を出力し、xamlで次のように定義されます。

 <FlowDocumentReader Name="flowReader" />
 <DocumentViewer Margin="0,10,0,0" Name="fixedReader" /> 

最終結果は次のとおりです。

ここに画像の説明を入力してください

上半分は、デバッグに使用しているFlowDocumentReaderです。ここではすべてが正常に機能します。下半分は、ページ付けされたドキュメントを含むDocumentViewerであり、正しく機能させるために必要なものです。

ページネーションプロセスを通じてバインディングデータをどの程度正確に保存できますか?

4

1 に答える 1

4

バウンティを設定してから10分後にわかりました。フィギュア。

どうやら、ディスパッチャは、flowdocument datacontextを割り当てた後、物事を進めるために少しプッシュする必要があります。

this.Dispatcher.Invoke(DispatcherPriority.SystemIdle, new Action(() => { }));
于 2013-02-18T23:11:28.500 に答える