当前位置:  开发笔记 > 编程语言 > 正文

为什么我在打印到XpsDocument时丢失了数据绑定?

如何解决《为什么我在打印到XpsDocument时丢失了数据绑定?》经验,为你挑选了1个好方法。

更新!

绑定工作.问题是XpsDocumentWriter没有正确编写FixedDocumentSequence的第一个文档的第一页.这似乎是很多人在做这类事情时遇到的问题(即全世界有五个开发人员).解决方案有点奇怪.我把它作为答案包括在内.


好吧,它比问题暗示的更微妙.

我有一系列的FixedPages,每个都有单独的DataContext设置.每个FixedPage还有一个或多个绑定到上下文的控件.

如果我将这些FixedPages添加到单个FixedDocument并将此单个FixedDocument写入XpsDocument,我的绑定将被取消引用(可以这么说),并且正确的值将显示在XpsDocument中.

如果我将这些FixedPages添加到单个FixedDocuments(每个FP添加到一个新FD),然后将这些FixedDocuments添加到FixedDocumentSequence,然后将此序列写入XpsDocument,我的绑定不会被引用,我的FixedPages显示为空白.

调试告诉我,我没有丢失绑定或绑定上下文,所以这不是导致失败的原因.

这里有一些示例代码来说明正在发生的事情:

// This works
FixedPage fp = CreateFixedPageWithBinding();
fp.DataContext = CreateDataContext();
// Add my databound fixed page to a new fixed document
var fd = new FixedDocument();
var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
fd.Pages.Add(pageContent);
// Create an xps document and write my fixed document to it
var p = Package.Open("c:\\output.xps", FileMode.CreateNew);
var doc = new XpsDocument(p);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
wri2.Write(fd);
p.Flush();
p.Close();

// This does NOT work
FixedPage fp = CreateFixedPageWithBinding();
fp.DataContext = CreateDataContext();
// Add my databound fixed page to a new fixed document
var fd = new FixedDocument();
var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
fd.Pages.Add(pageContent);
// Create a fixed document sequence and add the fixed document to it
FixedDocumentSequence fds = CreateFixedDocumentSequence();
var dr = new DocumentReference();
dr.BeginInit();
dr.SetDocument(fd);
dr.EndInit();
(fds as IAddChild).AddChild(dr);
// Create an xps document and write the fixed document sequence to it
var p = Package.Open("c:\\output.xps", FileMode.CreateNew);
var doc = new XpsDocument(p);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
wri2.Write(fds);
p.Flush();
p.Close();

您可以看到两者之间的唯一区别是我将固定文档添加到固定文档序列中,然后编写.

显然,当我的固定文档没有被写入Xps文档时,无论发生什么魔法导致数据绑定被评估并且插入绑定值都不会发生.我需要能够编写多个固定文档,并且只能调用一次Write方法,因此需要将FixedDocuments添加到我编写的FixedDocumentSequence中.但是我需要我该死的数据绑定工作!

在这种情况下的任何帮助将不胜感激.我知道它不完全是框架中最常见的部分; 我只是希望有人在这里有一些操作经验(我在看着你,潜伏着MS员工).



1> 小智..:

这个错误的原因是在写入之前没有更新FixedPage的布局.这会导致FixedDocumentSequence中第一个FixedDocument中的第一个FixedPage被错误地写入.这会影响结果文档中的其他页面,这使得此错误/边缘情况更难以确定.

以下WORKS(非工作示例的重写版本):

FixedPage fp = CreateFixedPageWithBinding();
fp.DataContext = CreateDataContext();
var fd = new FixedDocument();

/* PAY ATTENTION HERE */
// set the page size on our fixed document 
fd.DocumentPaginator.PageSize =
   new System.Windows.Size()
   {
       Width = DotsPerInch * PageWidth,
       Height = DotsPerInch * PageHeight
   };
// Update the layout of our FixedPage
var size = fd.DocumentPaginator.PageSize;
page.Measure(size);
page.Arrange(new Rect(new Point(), size));
page.UpdateLayout();    
/* STOP PAYING ATTENTION HERE */

var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
fd.Pages.Add(pageContent);
// Create a fixed document sequence and add the fixed document to it
FixedDocumentSequence fds = CreateFixedDocumentSequence();
var dr = new DocumentReference();
dr.BeginInit();
dr.SetDocument(fd);
dr.EndInit();
(fds as IAddChild).AddChild(dr);
// Create an xps document and write the fixed document sequence to it
var p = Package.Open("c:\\output.xps", FileMode.CreateNew);
var doc = new XpsDocument(p);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
wri2.Write(fds);
p.Flush();
p.Close();

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有