.net 在对flowdocument进行分页时保留绑定
我一直在尝试在.NET 4的WPF中构建一个简单的报告和打印系统,经过无数个小时的拖网和各种在线教程,我有了以下(简化的)设置,该设置应该包含一个包含报告模板的flowdocument,添加一个数据源作为datacontext,将它分页,最后得到可以显示/打印的内容 报告在单独的内容文件(DefaultReport.xaml)中的flowdocument中列出: 这是按如下方式加载和组合的:.net 在对flowdocument进行分页时保留绑定,.net,wpf,.net-4.0,reporting,.net,Wpf,.net 4.0,Reporting,我一直在尝试在.NET 4的WPF中构建一个简单的报告和打印系统,经过无数个小时的拖网和各种在线教程,我有了以下(简化的)设置,该设置应该包含一个包含报告模板的flowdocument,添加一个数据源作为datacontext,将它分页,最后得到可以显示/打印的内容 报告在单独的内容文件(DefaultReport.xaml)中的flowdocument中列出: 这是按如下方式加载和组合的: using (var stream = File.OpenRead("DefaultReport.xam
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将流程文档转换为XPS文档,如下所示:
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,这是我正常工作所需的
如何在分页过程中准确地保存绑定数据?设置悬赏10分钟后,我就知道了。数字 显然,在分配flowdocument datacontext之后,dispatcher需要一点推动,以使事情继续进行:
this.Dispatcher.Invoke(DispatcherPriority.SystemIdle, new Action(() => { }));
我也有同样的问题,你能告诉我你在代码中添加这一行的确切位置吗?我正在使用DocumentViewer。谢谢你,三年半过去了,我简直不记得了。根据我的回答,它一定在document.DataContext=newmydatacontext{MyText=“2”}之后;感谢Manos,尽管对我来说它仍然不起作用:-(这对我来说起作用了,我在设置数据上下文之后立即调用了dispatcher:
document.DataContext=DataContext;Application.Current.dispatcher.Invoke(DispatcherPriority.SystemIdle,new Action(()=>{}));
<FlowDocumentReader Name="flowReader" />
<DocumentViewer Margin="0,10,0,0" Name="fixedReader" />
this.Dispatcher.Invoke(DispatcherPriority.SystemIdle, new Action(() => { }));