2009-02-02 12 views
42

Posso prendere un controllo WPF (XAML) esistente, collegarlo a un database e trasformarlo in un documento XPS che può essere visualizzato e stampato utilizzando il visualizzatore di documenti XPS WPF? Se sì, come? In caso contrario, come dovrei fare "reporting" in WPF usando XPS/PDF/etc?Converti WPF (XAML) Controllo in documento XPS

Fondamentalmente voglio prendere un controllo WPF esistente, collegarlo al database per ottenere dati utili e renderlo stampabile e salvabile per l'utente finale. Idealmente, la creazione del documento verrebbe eseguita in memoria e non avrebbe colpito il disco a meno che l'utente non abbia salvato il documento in modo specifico. È fattibile?

+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) –

risposta

61

realtà dopo nei guai con cumuli di diversi campioni, che sono tutti incredibilmente contorta e richiedono l'uso di Document scrittori, Container, code di stampa e stampare biglietti, ho trovato un articolo di Eric Lavelli circa Printing in WPF
Il codice semplificato è un soli 10 linee lunghe

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

mio campione è abbastanza semplicistico, non include pagina Dimensionamento e l'orientamento che contiene tutta una serie diversa di questioni che non funzionano come ci si aspetterebbe. Né contiene alcuna funzionalità di salvataggio come MS sembra aver dimenticato di includere un pulsante Salva con Document Viewer.

Salva funzionalità è relativamente semplice (ed è anche da un articolo di Eric Lavelli)

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

Quindi la risposta è sì, si può prendere uno esistente WPF (XAML) di controllo, DataBind e trasformarlo in un XPS documento - e non è poi così difficile.

+1

Potresti fornire le definizioni per MyWPFControl e MyWPFControlDataSource ??? Il codice di esempio non ha valore senza di loro e l'articolo Sinks non sembra contenerli. –

+6

Jim, MyWPFControl è qualsiasi controllo (personalizzato, composito, standalone o altro) che si desidera avere come pagina di rendering all'interno del documento XPS. MyWPFControlDataSource è ovviamente qualsiasi dato, (di solito un ViewModel), che vuoi associare a quel controllo. L'esempio è stato intenzionalmente lasciato in una forma generica in modo che sia utile a chiunque lo guardi, non solo a qualcuno che cerca di rendere un controllo specifico a xaml. – Scott

+0

Questo è un giorno fortunato, trovato nella tua grande semplice risposta la soluzione di due dei miei problemi per questa settimana. –