WPF - пример создания документа XPS, который НЕ из Visual

Я ищу решение для создания отчетов / печати, которое не включает RDLC/SSRS. Я хотел бы использовать DocumentViewer, который, как я знаю, поддерживает XPS. Я нашел множество примеров, которые используют Visual to XPS, но я не нашел много примеров, где я могу взять существующую страницу WPF с различными элементами управления, такими как метки, списки, сетки и т. Д., И создать ее в документе XPS. Есть ли пример кода, который берет всю страницу XAML и создает XPS?

2 ответа

Решение

Это не тривиально, основная проблема здесь в том, что XPS представляет фиксированные страницы. Существующая страница WPF не обязательно переводится на страницы документа. Как будет разделяться ваш отчет, если он не помещается на странице? Эта информация нужна.

Что вы можете сделать, это создать отчет как FlowDocument (см. http://msdn.microsoft.com/en-us/library/aa970909.aspx). Это даст.NET Framework достаточно информации о том, как разбить на страницы ваш отчет, так что когда вы сделаете это:

FlowDocument flowDocument;

// load, populate your flowDocument here

XpsDocument xpsDocument = new XpsDocument("filename.xps", FileAccess.ReadWrite);
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
writer.Write(((IDocumentPaginatorSource)flowDocument).DocumentPaginator);

оно работает. (Код снят с Pro WPF в C# Book).

Обычно ваша страница WPF имеет корневой элемент пользовательского интерфейса, скажем Grid. Поскольку Grid - это особый тип Visual (см. "Иерархия наследования", часть @ http://msdn.microsoft.com/en-us/library/system.windows.controls.grid.aspx для получения дополнительной информации). записать этот корневой элемент Grid, как и другие визуальные элементы, в XPS. И тогда все встроенные элементы управления будут автоматически записаны в документ XPS.

Другие вопросы по тегам