我一直在尝试在 .NET 4 中的 WPF 中构建一个简单的报告和打印系统,经过无数小时的拖网 SO 和各种在线教程,我有以下(简化的)设置,应该采用包含报告模板的流文档,添加一个数据源作为数据上下文,通过分页并最终得到可以显示/打印的东西。
报告在单独的内容文件 (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,这是我正常工作所需要的。
如何通过分页过程保留绑定数据?