4

我一直在尝试在 .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,这是我正常工作所需要的。

如何通过分页过程保留绑定数据

4

1 回答 1

4

我在设置赏金后 10 分钟想通了。数字。

显然,在分配流文档数据上下文后,调度程序需要一点推动才能使事情顺利进行:

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