WPF打印多页预览

时间:2011-04-04 00:18:42

标签: wpf printing preview xps

我读到的关于这个主题的内容越多,我就越不明白,如果以下看起来完全不合适,请提前道歉。

我有一个包含flowdocument的usercontrol - 一个带有相应viewmodel的视图。目的是将其发送到预览窗口,用户可以在该窗口中查看文档并进行打印。

我从http://www.eggheadcafe.com/tutorials/aspnet/9cbb4841-8677-49e9-a3a8-46031e699b2e/wpf-printing-and-print-pr.aspx

的示例中提取了一些代码

以下称为

Public Shared Sub PrintPreview(owner As Window, data As FormData)

        Using xpsStream As New MemoryStream()

            Using package__1 As Package = Package.Open(xpsStream, FileMode.Create, FileAccess.ReadWrite)

                Dim packageUriString As String = "memorystream://data.xps"

                Dim packageUri As New Uri(packageUriString)

                PackageStore.AddPackage(packageUri, package__1)

                Dim xpsDocument__2 As New XpsDocument(package__1, CompressionOption.Maximum, packageUriString)

                Dim writer As XpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDocument__2)

                Dim visual As New Form(data)

                Dim printTicket As New PrintTicket()

                printTicket.PageMediaSize = A4PaperSize

                writer.Write(visual, printTicket)

                Dim document As FixedDocumentSequence = xpsDocument__2.GetFixedDocumentSequence()

                xpsDocument__2.Close()

                Dim printPreviewWnd As New PrintPreviewWindow(document)

                printPreviewWnd.Owner = owner

                printPreviewWnd.ShowDialog()

                PackageStore.RemovePackage(packageUri)

            End Using
        End Using

这将打开打印预览窗口并显示保存flowdocument的用户控件。但是,它只显示应该是多个页面的第一个。我是在假设编写xps然后在这个窗口中再次阅读它的全部要点是解决打印视觉问题,但我显然误解了整个过程。如果能够查看文档中的所有页面,我需要做的任何帮助才能通过我的厚头脑。非常感谢。

干杯

我认为上面使用xpsdocument和getfixeddocumentsequence会将flowdocument转换为fixeddocument,但是看不到,我可能写错了吗?

1 个答案:

答案 0 :(得分:6)

您可以将视觉效果打印到XPS。但是,据我所知,管理页面是你的工作。如果您的视觉效果太大而无法放在页面上,则需要找到将其拆分为多个页面的方法。

我在这里发布的源代码打印了许多页面上的项目列表:

https://bitbucket.org/paulstovell/samples/src/a323f0c65ea4/XPS%20Report%20Generator/

如果您可以找到一种方法来分割您的视觉效果(可能创建3个表单,每个表单15个项目)到页面中,您可以使用它:

using (var doc = new XpsDocument("P:\\Test2.xps", FileAccess.Write))
{
    var writer = XpsDocument.CreateXpsDocumentWriter(doc);
    var collator = writer.CreateVisualsCollator();

    collator.BeginBatchWrite();
    collator.Write(form1);
    collator.Write(form2);
    collator.Write(form3);
    collator.EndBatchWrite();
}

var doc2 = new XpsDocument("P:\\Test2.xps", FileAccess.Read);

var seq = doc2.GetFixedDocumentSequence();

var window = new Window();
window.Content = new DocumentViewer {Document = seq};
window.ShowDialog();

另外,请注意,如果您正在新建视觉效果并打印它,则需要先调整大小,否则可能会出现空白屏幕。这是一个生成数据页面的示例(当然,您可以更改尺寸以适合A4纸张。)

private StackPanel CreatePage()
{
    var panel = new StackPanel();
    panel.Width = 1000;
    panel.Height = 1000;

    for (var i = 0; i < 10; i++)
    {
        panel.Children.Add(new TextBlock() {Text = "Item " + i});
    }

    panel.Measure(new Size(1000, 1000));
    panel.Arrange(new Rect(0, 0, 1000, 1000));

    return panel;
}