Печать коллекции в WPF

Есть ли способ распечатать коллекцию памяти или размер переменной в WPF?

Я использую следующий код, в котором я печатаю элемент управления ListView. Но когда содержимое больше, чем вертикальная полоса прокрутки, она обрезает содержимое.

 PrintDialog printDialog = new PrintDialog();
                printDialog.ShowDialog();

                printDialog.PrintVisual(lvDocumentSummary, "testing printing!");

person azamsharp    schedule 15.10.2008    source источник


Ответы (6)


Для печати нескольких страниц вам просто нужно использовать класс, реализующий DocumentPaginator. FixedDocument — одна из более сложных реализаций, FlowDocument — более простая.

FlowDocument fd = new FlowDocument();

foreach(object item in items)
{
    fd.Blocks.Add(new Paragraph(new Run(item.ToString())));
}

fd.Print();

or

PrintDialog pd = new PrintDialog();
pd.PrintDocument(fd);
person Ifeanyi Echeruo    schedule 19.12.2008
comment
Это не работает. Не удается преобразовать FlowDocument в DocumentPaginator. Также у FlowDocument нет метода Print(). - person 3nuc; 15.06.2019

FixedDocument поддерживает DataBinding (кроме FlowDocument), как и любой другой документ xaml. просто разместите список в фиксированном документе и отобразите его в DocumentViewer (который имеет встроенную поддержку печати).

однако, если ваш список слишком длинный для одной страницы, FixedDocument не создает новую страницу автоматически (как это делает поток документов). поэтому вам нужно вручную создать новую страницу с кодом, так как это невозможно сделать в чистом xaml.

person Joachim Kerschbaumer    schedule 16.10.2008

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

Здесь приведен пример кода, который создает FixedDocument: http://www.ericsink.com/wpf3d/B_Printing.html

person Nir    schedule 16.10.2008

Вот ответ 2019 года. Некоторые из старых ответов больше не работают, например. FlowDocumentReader не имеет метода Print.

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            FlowDocument fd = new FlowDocument();
            foreach (var item in COLLECTION) //<- put your collection here
            {
                fd.Blocks.Add(new Paragraph(new Run(item.ToString())));
            }

            PrintDialog pd = new PrintDialog();
            if (pd.ShowDialog() != true) return;

            fd.PageHeight = pd.PrintableAreaHeight;
            fd.PageWidth = pd.PrintableAreaWidth;

            IDocumentPaginatorSource idocument = fd as IDocumentPaginatorSource;

            pd.PrintDocument(idocument.DocumentPaginator, "Printing Flow Document...");
        }
    }
person 3nuc    schedule 15.06.2019

Интересно, ListView виртуализирован? Если да, то объект не рисуется, это возможно. Взгляните на пример печати от Petzold.

person Artur Carvalho    schedule 15.10.2008
comment
Я проверил этот пример, но он использует файлы для печати. У меня есть коллекция памяти для печати! - person azamsharp; 15.10.2008
comment
Ссылка Petzold больше не существует - person Tim Trout; 22.02.2010

Вот мое решение этой проблемы. Это немного шатко, но работает для моего сценария.

Я читаю свою коллекцию и преобразовываю ее в строку. Вся коллекция теперь находится в объекте StringBuilder. Затем я записал текст/строку в файл на клиентской машине, а затем запустил процесс блокнота с параметром /p, чтобы распечатать содержимое файла.

Он работает и успешно печатает содержимое.

Наконец, есть таймер, который вызывается через 5 секунд и удаляет файл. В основном в течение 5 секунд запрос уже отправляется в очередь принтера. Но лучшим решением будет убедиться, что задание на печать было обработано, таким образом, вы будете на 100% уверены, что задание было выполнено.

person azamsharp    schedule 15.10.2008
comment
Вызов внешнего приложения для печати с условиями гонки? Ни за что! И подумать только, что вы управляете веб-сайтом базы знаний по разработке! Страшные вещи. - person OJ.; 09.04.2009
comment
Вы можете легко добиться этого, используя FlowDocument и FixedDocuments! - person azamsharp; 21.04.2009
comment
Это действительно плохой способ сделать это, вы только FlowDocument с BlockUIContainer. Если это особенно длинный список, используйте FixedDocument. - person Echilon; 30.12.2009