Печать примечаний WPF
И так у вас уже есть документ с подсветками и примечаниями и вы, вероятно, интересуетесь, как же его распечатать.
Самый простой путь - использовать встроенную поддержку печати Примечаний. Встроенный механизм печати поддерживает механизм WYSIWYG (что видишь, то и получаешь). Это означает то, что Примечания будут напечатаны точно так же, как вы их видите в документе. Т.е. если примечания свернуты, они и будут напечатаны в свернутом виде, если они перекрывают текст на экране, на бумаге текст так же будет перекрыт и т.д.
Добавление поддержки печати примечаний очень просто. Я уже говорил об этом в предыдущих постах, но вынужден сказать еще раз из-за некоторых проблем с печатью, которые, к сожалению, присутствуют в вышедшей Beta 2. Но поскольку кое-кого это может заинтересовать, я повторюсь в этом маленьком отступлении:
В февральском CTP этот код будет печатать примечания контента как FlowDocument так и FixedDocument. В Beta 2 только Fixed контента (включая XPS), для Flow контента это не сработает. (Конечно же в RTM версии все снова будет работать для обоих случаев).
Ну, хватит болтать, давайте взглянем на код. Изменим код предыдущего
<DocumentViewer Name="Viewer" Grid.Row="1">
<DocumentViewer.CommandBindings>
<CommandBinding Command="ApplicationCommands.Print" Executed="OnPrint" />
</DocumentViewer.CommandBindings>
</DocumentViewer>
Теперь добавим обработчик события:
protected void OnPrint(object sender, EventArgs e)
{
PrintDialog dialog = new PrintDialog();
bool? result = dialog.ShowDialog();
if (result != null && result.Value)
{
XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(dialog.PrintQueue);
AnnotationService service = AnnotationService.GetService(Viewer);
AnnotationDocumentPaginator adp = new AnnotationDocumentPaginator(
_xpsDocument.GetFixedDocumentSequence().DocumentPaginator,
service.Store);
writer.Write(adp);
}
}
Как видно из примера, примечания добавляются в очередь печати путем замены IDocumentPaginator на AnnotationDocumentPaginator (ADP). Что незаметно в этом примере из-за метода работы XPS документа, это то, что вы всегда должны отправлять копию вашего документа AnnotationDocumentPaginator'у. Если этого не сделать, DocumentPaginator который будет отображаться, будет поврежден, и после печати вы больше не сможете просматривать документ или корректно работать с примечаниями.
И последнее слово о синхронизации. В API печати не встроено механизмов синхронизации. Поэтому, если вы хотите производить фоновую печать, вам нужно скопировать поток Annotation и использовать конструктор AnnotationDocumentPaginator, которому передается поток. Если вы передадите AnnotationStore напрямую, все изменения, производимые в документе, во время печати могут быть частично отражены в уже печатаемом документе.
Источник:
Перевод: BigPilot
По теме
- Создаем контекстно-зависимое WPF-приложение
- #024 – Знакомство с WPF/E
- #023 – Введение в WPF, reloaded…
- #022 Введение в Microsoft Interactive Designer RC1
- #021 Применение 3D в WPF - Часть 2
- #020 Применение 3D в WPF - Часть 1
- #019 Введение в возможности 3D на WPF
- #018 Размещение контрола NET 2.0 на форме WPF
- #017 Первое Web-приложение / Подробнее о Grid / Элемент Frame
- #016 EXE, XBAP, XAML? - Все равно!