8

更新!

装订工作。问题是 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 员工)。

4

3 回答 3

9

这个错误的原因是 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();
于 2009-01-16T16:51:34.220 回答
1

我在尝试使用XpsDocumentWriter写入PrintQueue. 以下代码正确打印第一页。

//Prints correctly
FixedDocumentSequence Documents = new FixedDocumentSequence();

//some code to add DocumentReferences to FixedDocumentSequence

PrintDialog printDialog = new PrintDialog
{
    PrintQueue = LocalPrintServer.GetDefaultPrintQueue() 
};
printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket;
if (printDialog.ShowDialog() == true)
{
    Documents.PrintTicket = printDialog.PrintTicket;

    XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printDialog.PrintQueue);
    writer.Write(Documents, printDialog.PrintTicket);
    printerName = printDialog.PrintQueue.FullName;
}

如果您删除printDialog.ShowDialog()并尝试静默打印到默认打印机,则第一页打印不正确。但是,在我的场景中,我不需要使用 a FixedDocumentSequence,所以我将它换成了一个单一的FixedDocument静默打印工作。FixedPage我尝试在没有成功的情况下更新布局。奇怪的是,如果我显示打印对话框,第一页的打印效果如何。

于 2017-11-28T22:48:58.050 回答
0

丢失绑定的一个原因是您在某处抛出了异常 - 不幸的是,此异常被默默吞下,您的绑定只是“停止工作”。打开 First-chance exceptions,看看是否有什么被击中。

于 2009-01-16T03:05:42.207 回答