2009-02-02 16 views
42

Kann ich ein vorhandenes WPF-Steuerelement (XAML) verwenden, es zu einem XPS-Dokument umwandeln und es mithilfe des WPF XPS Document Viewers anzeigen und drucken? Wenn ja, wie? Wenn nicht, wie soll ich in WPF mit XPS/PDF/etc "berichten"?WPF (XAML) Control in XPS-Dokument konvertieren

Grundsätzlich möchte ich ein vorhandenes WPF-Steuerelement nehmen, es in Daten umwandeln, um nützliche Daten hinein zu bekommen und es dann für den Endbenutzer druckbar und speicherbar zu machen. Idealerweise würde die Dokumenterstellung im Speicher erfolgen und würde die Platte nicht treffen, wenn der Benutzer das Dokument nicht speziell gespeichert hat. Ist das machbar?

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

Antwort

61

Eigentlich mit jeder Menge verschiedener Proben nach Herumspielen, von denen alle unglaublich gewunden sind und erfordern den Einsatz von Document Writer, Container, Druckerwarteschlangen und Druck Tickets, ich Eric Sinks Artikel über Printing in WPF
Der vereinfachte Code gefunden ist nur 10 Zeilen lang

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

Meine Probe ziemlich simpel ist, ist es nicht Seite Sizing und Orientierung aufweist, die eine ganz andere Reihe von Fragen enthält, wie man es erwarten würde nicht funktionieren. Es enthält auch keine Speicherfunktionalität, da MS anscheinend vergessen hat, eine Save-Schaltfläche in den Document Viewer einzufügen.

Speichern Funktionalität ist relativ einfach (und ist auch von Eric Sinks Artikel)

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

So ist die Antwort Ja ist, können Sie eine vorhandene WPF (XAML) die Kontrolle übernehmen, databind es und machen es zu einem XPS Dokument - und es ist nicht so schwer.

+1

Könnten Sie bitte die Definitionen für MyWPFControl und MyWPFControlDataSource angeben ??? Der Beispielcode ist ohne sie wertlos und der Sinks-Artikel scheint sie nicht zu enthalten. –

+6

Jim, MyWPFControl ist ein Steuerelement (benutzerdefiniert, zusammengesetzt, eigenständig oder nicht), das als Seite in Ihrem XPS-Dokument gerendert werden soll. MyWPFControlDataSource ist offensichtlich beliebige Daten (normalerweise ein ViewModel), die Sie an das Steuerelement binden möchten. Das Beispiel wurde absichtlich in einer generischen Form gelassen, so dass es für jeden, der es betrachtet, nützlich ist, nicht nur für jemanden, der ein bestimmtes Steuerelement für xaml rendern möchte. – Scott

+0

Dies ist ein glücklicher Tag, gefunden in Ihrer großen einfachen Antwort die Lösung von zwei meiner Probleme für diese Woche. –