Типы документов
Фиксированные документы – документы готовые для печати. Все
позиционирование в документе является фиксированным.
Потоковые документы – документ предназначен для просмотра на мониторе, WPF может компоновать содержимое документа динамически.
Типы элементов содержимого
Блочные элементы – применяются для группирования других элементов. Например: Paragraph.
Встроенные элементы – содержат данные, которые будут находится в блочном элементе. Например: Run.
Встроенные элементы содержимого
- Run – содержит обычный текст.
- Span — Заключает в себе любое количество встроенных элементов
- содержимого.
- Bold, Italic, Underline – применение форматов.
- Hyperlink – создание ссылки.
- LineBreak – добавление разрыва строки внутри блочного элемента.
- InlineUIConteiner – подобен BlockUIElement используется для добавления элементов которые наследуются от класса UIElement
- Floater, Figure – позволяет создавать плавающие блоки содержимого с текстом, изображением и прочим. Большинство свойств Figure не будут работать в контейнере FlowDocumentScrollViewer
Контейнеры потоковых документов
- FlowDocumentScrollViewer – контейнер с линией прокрутки, он не поддерживает разбиение на страницы или отображение в несколько колонок.
- FlowDocumentPageViewer – разбивает содержимое документа на страницы.
- FlowDocumentReader – комбинирует два предыдущих контейнера и обладает функцией поиска.
Методы для печати
Для печати используется два метода:
- PrintVisual() печать объектов производных от класса Visual.
- PrintDocument() печать потоковых документов.
Пример использования PrintDocument
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
using System.Windows; using System.Windows.Controls; using System.Windows.Documents; namespace PrintFlowDocument { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void cmdPrint_Click(object sender, RoutedEventArgs e) { PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() == true) { // для печати потоковых документов используется метод PrintDocument printDialog.PrintDocument(((IDocumentPaginatorSource)docReader.Document).DocumentPaginator, "A Flow Document"); } } private void cmdPrintCustom_Click(object sender, RoutedEventArgs e) { PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() == true) { FlowDocument doc = docReader.Document; // Сохранить все существующие настройки. double pageHeight = doc.PageHeight; double pageWidth = doc.PageWidth; Thickness pagePadding = doc.PagePadding; double columnGap = doc.ColumnGap; double columnWidth = doc.ColumnWidth; // Подгоняем размеры FlowDocument под размеры страницы для печати doc.PageHeight = printDialog.PrintableAreaHeight; doc.PageWidth = printDialog.PrintableAreaWidth; doc.PagePadding = new Thickness(50); // Применяем две колонки. doc.ColumnGap = 25; // Пробелы между колонками. doc.ColumnWidth = (doc.PageWidth - doc.ColumnGap - doc.PagePadding.Left - doc.PagePadding.Right) / 2; printDialog.PrintDocument(((IDocumentPaginatorSource)doc).DocumentPaginator, "A Flow Document"); // Возобновляем старые настройки. doc.PageHeight = pageHeight; doc.PageWidth = pageWidth; doc.PagePadding = pagePadding; doc.ColumnGap = columnGap; doc.ColumnWidth = columnWidth; } } } } |
Пример использования PrintVisual
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace PrintCustomVisual { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void cmdPrint_Click(object sender, RoutedEventArgs e) { PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() == true) { // Создание DrawingVisual для рисования. DrawingVisual visual = new DrawingVisual(); // Получения DrawingContext using (DrawingContext dc = visual.RenderOpen()) { Pen pen = new Pen(Brushes.Black, 1); Rect rect = new Rect(printDialog.PrintableAreaWidth / 2 - 50, printDialog.PrintableAreaHeight / 2 - 50, 100, 100); dc.DrawRectangle(Brushes.Black, pen, rect); } // Печать printDialog.PrintVisual(visual, "A Custom-Printed Page"); } } } } |