WPF - нумерация страниц при печати визуала
У меня есть окно WPF с рамкой. У меня есть код для распечатки содержимого фрейма с использованием printdialog и printvisual. Но это будет печатать только то, что появляется на экране, даже если доступны свитки кадров и другие части.
Есть ли способ добавить нумерацию страниц и убедиться, что весь контент моего фрейма будет распечатан.
Или есть другой способ взять содержимое моего фрейма и распечатать его? т.е. не использовать printvisual?
1 ответ
Да. Я сделал это Это не очень сложно.
Оберните свой фрейм внутри ScrollViewer, у которого обычно отключена горизонтальная и вертикальная прокрутка
Когда вы будете готовы к печати, включите вертикальную прокрутку. Это заставит кадр сказать, что он имеет бесконечное вертикальное пространство, поэтому он будет отображать весь контент. Затем вызовите UpdateLayout(), чтобы получить макет для обновления.
Реализуйте IDocumentPaginator, чтобы он возвращал один и тот же фрейм для каждой страницы, но каждый раз корректируйте клип и RenderTransform, чтобы показать различную часть фактического фрейма.
Печатайте, используя свой собственный IDocumentPaginator
Приведенное выше описание предполагает, что вы хотите зафиксировать ширину рамки по ширине страницы и разбить ее на страницы по вертикали. Это будет подходящим для веб-страницы, но не для электронной таблицы. Для контента, подобного электронной таблице, вы должны установить ScrollViewer, чтобы разрешить прокрутку в обоих направлениях, предоставляя рамке бесконечное пространство в каждом направлении. В этом случае IDocumentPaginator является тем же, за исключением того, что RenderTransforms и отсечение выбраны для итерации как по горизонтали, так и по вертикали.
Этот метод на самом деле работает для любого содержимого WPF, а не только для фрейма.
Смотрите также
Постраничная печать WPF Visuals
Вы можете выполнить рекурсивный цикл по визуальному дереву с помощью VisualTreeHelper и преобразовать все найденные элементы управления в элементы для использования в потоковом документе. Этот поток-документ вы можете распечатать. Я думаю, что нет приемлемого способа напечатать содержимое непосредственно из графического интерфейса.