2009-02-02 10 views
42

¿Puedo tomar un control WPF (XAML) existente, enlazarlo y convertirlo en un documento XPS que se pueda mostrar e imprimir 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.?Conversión de control WPF (XAML) en documento XPS

Básicamente, quiero tomar un control WPF existente, unirlo en datos para obtener datos útiles en él y luego hacerlo imprimible y guardable 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?

+0

[http://msdn.microsoft.com/en-us/library/system.windows.xps.visualstoxpsdocument.aspx](http://msdn.microsoft.com/en-us/library/system.windows .xps.visualstoxpsdocument.aspx) –

Respuesta

61

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.

+1

¿Podría proporcionar las definiciones de MyWPFControl y MyWPFControlDataSource ??? El código de ejemplo no tiene valor sin ellos y el artículo de Sinks no parece contenerlos. –

+6

Jim, MyWPFControl es cualquier control (personalizado, compuesto, independiente u otro) que desee que se haya representado como una página dentro de su documento XPS. MyWPFControlDataSource es obviamente cualquier información, (generalmente un ViewModel), que desea vincular a ese control. El ejemplo se ha dejado deliberadamente en una forma genérica, por lo que es útil para cualquier persona que lo mire, no solo para alguien que busca otorgar un control específico a xaml. – Scott

+0

Este es un día de suerte, que se encuentra en su gran respuesta simple la solución de dos de mis problemas para esta semana. –