将WPF(XAML)控件转换为XPS文档

我可以使用现有的WPF(XAML)控件,将其数据绑定并将其转换为可使用WPF XPS文档查看器进行显示和打印的XPS文档? 如果是这样,怎么样? 如果不是,我应该如何使用XPS / PDF /等在WPF中进行“报告”?

基本上我想采取一个现有的WPF控件,数据绑定它获得有用的数据,然后使其可打印和可保存的最终用户。 理想情况下,文档创build将在内存中完成,除非用户专门保存文档,否则不会打到磁盘。 这可行吗?

事实上,在混淆了不同样本的堆之后,所有这些都令人难以置信地令人费解,并且需要使用文档编写器,容器,打印队列和打印票据,我发现Eric Sinks有关在WPF中打印的文章
简化的代码只有10行

public void CreateMyWPFControlReport(MyWPFControlDataSource usefulData) { //Set up the WPF Control to be printed MyWPFControl controlToPrint; controlToPrint = new MyWPFControl(); controlToPrint.DataContext = usefulData; FixedDocument fixedDoc = new FixedDocument(); PageContent pageContent = new PageContent(); FixedPage fixedPage = new FixedPage(); //Create first page of document fixedPage.Children.Add(controlToPrint); ((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage); fixedDoc.Pages.Add(pageContent); //Create any other required pages here //View the document documentViewer1.Document = fixedDoc; } 

我的示例是相当简单的,它不包括页面大小和方向,其中包含一个完全不同的问题,不会像你所期望的那样工作。 它也不包含任何保存function,因为MS似乎忘记了在文档查看器中包含保存button。

保存function相对简单(也来自Eric Sinks的文章)

 public void SaveCurrentDocument() { // Configure save file dialog box Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); dlg.FileName = "MyReport"; // Default file name dlg.DefaultExt = ".xps"; // Default file extension dlg.Filter = "XPS Documents (.xps)|*.xps"; // Filter files by extension // Show save file dialog box Nullable<bool> result = dlg.ShowDialog(); // Process save file dialog box results if (result == true) { // Save document string filename = dlg.FileName; FixedDocument doc = (FixedDocument)documentViewer1.Document; XpsDocument xpsd = new XpsDocument(filename, FileAccess.ReadWrite); System.Windows.Xps.XpsDocumentWriter xw = XpsDocument.CreateXpsDocumentWriter(xpsd); xw.Write(doc); xpsd.Close(); } } 

所以答案是肯定的,你可以使用一个现有的WPF(XAML)控件,将其绑定到XPS文档中 – 并不是那么困难。