47 votes

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

Puis-je prendre un contrôle WPF (XAML) existant, le lier aux données et le transformer en un document XPS qui peut être affiché et imprimé à l'aide de la visionneuse de documents WPF XPS ? Si oui, comment ? Si ce n'est pas le cas, comment dois-je faire pour créer des rapports dans WPF en utilisant XPS/PDF/etc ?

En gros, je veux prendre un contrôle WPF existant, le lier à des données utiles, puis le rendre imprimable et enregistrable pour l'utilisateur final. Idéalement, la création du document se ferait en mémoire et ne toucherait pas le disque à moins que l'utilisateur n'enregistre spécifiquement le document. Est-ce faisable ?

70voto

Scott Points 2052

En fait, après avoir essayé des tas d'échantillons différents, tous incroyablement compliqués et nécessitant l'utilisation de rédacteurs de documents, de conteneurs, de files d'attente d'impression et de tickets d'impression, j'ai trouvé l'article d'Eric Sinks sur Impression 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 exemple est assez simpliste, il n'inclut pas le dimensionnement et l'orientation de la page qui contient un ensemble de problèmes différents qui ne fonctionnent pas comme on pourrait s'y attendre. Il ne contient pas non plus de fonctionnalité de sauvegarde, car MS semble avoir oublié d'inclure un bouton de sauvegarde dans la visionneuse de documents.

La fonctionnalité de sauvegarde 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<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();
 }
}

La réponse est donc Oui, vous pouvez prendre un contrôle WPF (XAML) existant, le lier à des données et le transformer en un document XPS - et ce n'est pas si difficile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X