en realidad después de jugar un poco con montones de diferentes muestras, todos los cuales son increíblemente complicado y requieren el uso de Documento escritores, contenedores, colas de impresión e imprimir entradas, encontré el artículo de Eric Fregaderos sobre Printing in WPF
El código simplificado es una apenas 10 líneas largas
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, que no incluye Página Tamaño y Orientación que contiene un conjunto completamente diferente de las cuestiones 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.
Guardar funcionalidad es relativamente simple (y también en el artículo de Eric lavamanos)
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();
}
}
Así que la respuesta es sí, se puede tomar un WPF (XAML) de control existentes, databind y convertirlo en un XPS documento - y no es tan difícil.
[http://msdn.microsoft.com/en-us/library/system.windows.xps.visualstoxpsdocument.aspx](http://msdn.microsoft.com/en-us/library/system.windows .xps.visualstoxpsdocument.aspx) –