5

我正在尝试使用FixedDocument保存 XPS 文档。到目前为止,我未能更改页面大小。如何将其更改为自定义尺寸?

我的代码基于这个问题的第一个答案,更具体地说,我正在使用这个代码:

        if (File.Exists(filename)) {
            File.Delete(filename);
        }

        var oldParent = LogicalTreeHelper.GetParent(this) as ContentControl;
        try {
            oldParent.Content = null;

            FixedDocument doc = new FixedDocument();

            PageContent pageCnt = new PageContent();
            FixedPage page = new FixedPage();

            page.Children.Add(this);
            try {
                ((System.Windows.Markup.IAddChild)pageCnt).AddChild(page);
                doc.Pages.Add(pageCnt);

                XpsDocument xpsDoc = new XpsDocument(filename, FileAccess.ReadWrite);
                try {
                    var writer = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
                    writer.Write(doc);
                }
                finally {
                    xpsDoc.Close();
                }
            }
            finally {
                page.Children.Clear();
            }
        }
        finally {
            ((ContentControl)oldParent).Content = this;
        }

它将用户控件复制到 XPS 文档中并成功完成,但正如我所说,使用默认纸张大小。

我尝试使用该DocumentPaginator.PageSize属性来设置新的页面大小(在实例化之后FixedDocument),但是我分配给该属性的任何内容似乎都被忽略了;生成的 XPS 文档中的页面保留其默认纸张大小。

逐步执行时,我可以看到PageSize属性的值确实发生了变化,所以它并不像新值不被DocumentPaginator.

我找到了各种在线资源,但都没有解决我的问题:

  • 这个在 MS Social 上发帖的论坛坚持认为设置PageSize属性是有效的,但据我所知并没有。
  • 文档声称设置PageSize属性有效,并提供了一个与我尝试过的相同的示例。(除此之外,基于此文档页面,我什至无法说出要使用的数字的单位。)
  • 文档还指向DocumentPage.Size属性,但是该属性不能公开更改。在将页面添加到文档之前,我是否真的必须覆盖某些页面类才能获得不同的页面大小?
  • 这个论坛帖子描述了同样的问题,但答案对我来说似乎很荒谬。我DocumentPaginator只使用过一次该属性,因此没有“再次调用 (...).DocumentPaginator”可以保存一个实例。
  • 这个问题听起来很有希望,但实际上不是关于页面大小,而是关于给定页面上图像的比例。
  • 除了前面提到的属性(PageSize无论如何这里设置为默认大小),本教程使用. 但是,为快速测试分配一些正随机值会导致我的 XPS 文档明显损坏,并且 XPS 查看器在打开它时会显示错误消息。WidthHeightFixedPage
4

2 回答 2

2

FixedDocuments have fixed pages. The height and width of FixedPage can be controlled. Somewhat like this:

        FixedPage pageOne = new FixedPage();
        pageOne.Height = 20;
        pageOne.Width = 10;

or in XAML:

Height="20" Width="10"

于 2012-10-31T11:39:54.527 回答
1

I believe a FixedDocument will only print at the size of its pages. Even when loading a FixedDocument into a DocumentViewer, changing the printer settings' page size when you click the print button will have no effect. A FixedDocument by its very definition preserves the fidelity of the its contents exactly.

The only way to modify it is to create a derived DocumentPaginator which calls the FixedDocument.DocumentPaginator's functions internally and modifies the return values accordingly.

于 2012-10-15T12:17:53.740 回答