Вопрос

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

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

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

                printDialog.PrintVisual(lvDocumentSummary, "testing printing!");
Это было полезно?

Решение

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

FlowDocument fd = new FlowDocument();

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

fd.Print();

или

PrintDialog pd = new PrintDialog();
pd.PrintDocument(fd);

Другие советы

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

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

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

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

Вот ответ 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...");
        }
    }

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top