Convertir le contrôle WPF (XAML) en document XPS

Puis-je prendre un contrôle WPF existant (XAML), le connecter et le transformer en un document XPS pouvant être affiché et imprimé à l’aide de WPF XPS Document Viewer? Si c’est le cas, comment? Si non, comment devrais-je faire des “rapports” dans WPF en utilisant XPS / PDF / etc?

Fondamentalement, je veux prendre un contrôle WPF existant, le connecter à une firebase database pour y insérer des données utiles, le rendre ensuite imprimable et économisable pour l’utilisateur final. Idéalement, la création du document se ferait en mémoire et ne bashait pas le disque à moins que l’utilisateur ait spécifiquement enregistré le document. Est-ce faisable?

En fait, après avoir manipulé des tas de différents échantillons, tous extrêmement compliqués et nécessitant l’utilisation de Document Writers, Containers, Print Queues et Print Tickets, j’ai trouvé l’article d’Eric Sinks sur Printing dans WPF.
Le code simplifié ne compte que 10 lignes

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

Mon échantillon est assez simpliste, il n’inclut pas le dimensionnement et l’orientation de la page qui contient un ensemble différent de problèmes qui ne fonctionnent pas comme prévu. Il ne contient pas non plus de fonctionnalité de sauvegarde, car MS semble avoir oublié d’inclure un bouton Enregistrer dans l’afficheur de documents.

Save Functionality est relativement simple (et provient également de l’article d’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 ssortingng 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(); } } 

Donc, la réponse est oui, vous pouvez prendre un contrôle WPF (XAML) existant, le connecter et le transformer en document XPS – et ce n’est pas si difficile.