.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であり、正しく機能させるために必要なものです。
ページネーションプロセスを通じてバインディングデータをどの程度正確に保存できますか?