Convierta el control de WPF (XAML) al documento de XPS

¿Puedo tomar un control WPF (XAML) existente, relacionarlo y convertirlo en un documento XPS que pueda mostrarse e imprimirse con el visor de documentos XPS de WPF? ¿Si es así, cómo? Si no, ¿cómo debería estar ‘informando’ en WPF usando XPS / PDF / etc.?

Básicamente, quiero tomar un control WPF existente, vincularlo con datos para obtener datos útiles y luego hacerlos imprimibles y guardables para el usuario final. Idealmente, la creación del documento se haría en la memoria y no golpearía el disco a menos que el usuario guardara el documento específicamente. ¿Es esto factible?

En realidad, después de jugar con montones de muestras diferentes, todas ellas increíblemente intrincadas y que requieren el uso de Escritores de Documentos, Contenedores, Colas de Impresión e Imprimir Boletos, encontré el artículo de Eric Sinks sobre Impresión en WPF
El código simplificado es de apenas 10 líneas de largo

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; } 

Mi muestra es bastante simplista, no incluye el tamaño de página y la orientación, que contiene un conjunto diferente de problemas que no funcionan como era de esperar. Tampoco contiene ninguna funcionalidad de guardado ya que MS parece haber olvidado incluir un botón Guardar con el Visor de documentos.

La funcionalidad de guardar es relativamente simple (y también es del artículo de 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 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(); } } 

Entonces, la respuesta es Sí, puede tomar un control WPF (XAML) existente, enlazarlo y convertirlo en un documento XPS, y no es tan difícil.