Konwertuj kontrolę WPF (XAML) na dokument XPS

Czy mogę pobrać istniejącą kontrolę WPF (XAML), zmodyfikować ją i przekształcić w dokument XPS, który można wyświetlić i wydrukować za pomocą przeglądarki dokumentów WPF XPS? Jeśli tak, to w jaki sposób? Jeśli nie, jak powinienem robić "raportowanie" w WPF za pomocą XPS / PDF / etc?

Zasadniczo chcę wziąć istniejącą kontrolę WPF, zmodyfikować ją, aby uzyskać do niej przydatne dane, a następnie uczynić ją drukowaną i możliwą do zapisania dla użytkownika końcowego. Najlepiej, aby tworzenie dokumentu odbywało się w pamięci i nie trafiało na dysk, chyba że użytkownik specjalnie zapisał dokument. Czy to możliwe?

Author: lisp, 2009-02-02

1 answers

Właściwie po grzebaniu w stosach różnych próbek, z których wszystkie są niesamowicie zawiłe i wymagają użycia pisarzy dokumentów, kontenerów, kolejek drukowania i biletów drukowania, znalazłem artykuł Erica Sinksa o drukowaniu w WPF
Kod uproszczony ma tylko 10 linii

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

Moja próbka jest dość uproszczona, nie zawiera rozmiaru i orientacji strony, która zawiera zupełnie inny zestaw problemów, które nie działają tak, jak można się spodziewać. Ani nie zawierać wszelkie funkcje zapisu, ponieważ MS zdaje się zapomnieć włączyć przycisk Zapisz w przeglądarce dokumentów.

Funkcjonalność zapisu jest stosunkowo prosta (i jest również z artykułu Erica Sinksa)

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

Więc odpowiedź brzmi tak, można wziąć istniejącą kontrolę WPF (XAML), databind go i przekształcić go w dokument XPS - i to nie jest takie trudne.

 65
Author: Scott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-03 01:21:52