Я ищу решение для отчетности / печати, не использующее RDLC / SSRS. Я хотел бы использовать DocumentViewer, который, как я знаю, поддерживает XPS. Я нашел множество примеров, использующих Visual to XPS, но я не нашел много примеров, где я мог бы взять существующую страницу WPF с различными элементами управления, такими как метки, списки, сетки и т. Д., И создать их в документе XPS. Есть ли там пример кода, который берет всю страницу XAML и создает XPS?
WPF - пример создания документа XPS НЕ из Visual
Ответы (2)
Это нетривиально, основная проблема здесь в том, что XPS представляют собой фиксированные страницы. Существующая страница WPF не обязательно переводится на страницы документа. Как будет разделен ваш отчет, если он не умещается на странице? Эта информация нужна.
Вы можете создать отчет как FlowDocument (см. http://msdn.microsoft.com/en-us/library/aa970909.aspx). Это даст платформе .NET достаточно информации о том, как разбить отчет на страницы, чтобы при этом:
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. Поскольку сетка - это особый тип визуала (см. Раздел «Иерархия наследования» @ http://msdn.microsoft.com/en-us/library/system.windows.controls.grid.aspx для получения дополнительных сведений), вам просто нужно написать этот корневой элемент сетки, как и другие визуальные эффекты в XPS. И тогда все встроенные элементы управления будут автоматически записаны в документ XPS.