WPF печать нескольких страниц с предварительным просмотром - PullRequest
4 голосов
/ 04 апреля 2011

Чем больше я читаю на эту тему, тем меньше я понимаю, поэтому заранее извиняюсь, если нижеприведенное выглядит совершенно не так.

У меня есть usercontrol, который содержит потоковый документ - представление с соответствующей моделью представления. Цель состоит в том, чтобы отправить это в окно предварительного просмотра, где пользователь может просмотреть документ, а также распечатать его.

Я поднял некоторый код из примера на 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

Это вызывает окно предварительного просмотра печати и показывает пользовательский элемент управления, который содержит потоковый документ. Тем не менее, он показывает только первый из нескольких страниц. Я предполагал, что весь смысл написания xps, а затем повторного чтения в этом окне должен был обойти проблему печати визуала, но я, очевидно, неправильно понимаю весь процесс. Буду очень признателен за любую помощь в прохождении моей тупой головы, что мне нужно сделать, чтобы иметь возможность просматривать все страницы в документе.

Приветствия

Я думал, что вышеупомянутое с использованием xpsdocument и getfixeddocumentsequence преобразует потоковый документ в фиксированный документ, но, видя, нет, возможно, я пишу его неправильно ??

1 Ответ

6 голосов
/ 04 апреля 2011

Вы можете распечатать визуал в 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();

Кроме того, обратите внимание, что если вы обновляете визуальное изображение и распечатываете его, вам сначала нужно его размерв противном случае вы можете получить пустой экран.Вот пример создания страницы данных (конечно, вы изменили бы размеры, чтобы соответствовать листу А4).

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;
}
...