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

puis-je prendre un contrôle WPF (XAML) existant, le databind et le transformer en un document XPS qui peut être affiché et imprimé en utilisant le WPF XPS Document Viewer? Si oui, comment? Si ce n'est pas le cas, comment dois-je procéder pour "faire rapport" dans le cadre du FPF en utilisant XPS/PDF/etc?

Fondamentalement, je veux prendre un contrôle WPF, databind pour obtenir des données utiles, et ensuite à le rendre imprimable et saveable pour l'utilisateur final. Idéalement, la création du document se ferait en mémoire et ne toucherait pas le disque sauf si l'Utilisateur a sauvegardé le document. Est-ce faisable?

44
demandé sur lisp 2009-02-02 07:36:09

1 réponses

en fait, après avoir joué avec des tas de différents échantillons, qui sont tous incroyablement alambiqués et nécessitent l'utilisation de rédacteurs de documents, des conteneurs, des files d'attente D'impression et des Tickets D'impression, J'ai trouvé L'article D'Eric Sinks à propos de Impression en WPF

Le code simplifié n'a que 10 lignes de long

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 ne comprend pas la taille de la Page et L'Orientation qui contient un ensemble tout à fait différent de questions qui ne fonctionnent pas comme vous attendez. Ni ne contient aucune save fonctionnalités que MS semblent avoir oublié d'inclure un bouton "Enregistrer" avec la Visionneuse de documents.

Enregistrer la Fonctionnalité est relativement simple (et qui est aussi à partir de Eric Puits de l'article)

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

donc la réponse est oui, vous pouvez prendre un contrôle WPF (XAML) existant, le databind et le transformer en un document XPS - et ce n'est pas si difficile.

65
répondu Scott 2009-02-03 01:21:52