Печать примечаний WPF

Автор: Topol Воскресенье, Май 6th, 2012 Нет комментариев

Рубрика: Операционные системы

И так у вас уже есть документ с подсветками и примечаниями и вы, вероятно, интересуетесь, как же его распечатать.

Самый простой путь — использовать встроенную поддержку печати Примечаний. Встроенный механизм печати поддерживает механизм WYSIWYG (что видишь, то и получаешь). Это означает то, что Примечания будут напечатаны точно так же, как вы их видите в документе. Т.е. если примечания свернуты, они и будут напечатаны в свернутом виде, если они перекрывают текст на экране, на бумаге текст так же будет перекрыт и т.д.

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

В февральском CTP этот код будет печатать примечания контента как FlowDocument так и FixedDocument. В Beta 2 только Fixed контента (включая XPS), для Flow контента это не сработает. (Конечно же в RTM версии все снова будет работать для обоих случаев).

Ну, хватит болтать, давайте взглянем на код. Изменим код предыдущего примера. Для начала изменим событие по-умолчанию для кнопки Print в DocumentViewer’e:

Код:
<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 напрямую, все изменения, производимые в документе, во время печати могут быть частично отражены в уже печатаемом документе.

Источник: thevista.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты