Преобразовать элемент управления WPF (XAML) в документ XPS - PullRequest
46 голосов
/ 02 февраля 2009

Могу ли я взять существующий элемент управления WPF (XAML), связать его с данными и превратить в документ XPS, который можно отобразить и распечатать с помощью средства просмотра документов WPF XPS? Если так, то как? Если нет, то как мне делать «отчеты» в WPF с использованием XPS / PDF / etc?

По сути, я хочу взять существующий элемент управления WPF, связать его с данными, чтобы вставить в него полезные данные, а затем сделать его пригодным для печати и сохранения для конечного пользователя. В идеале создание документа должно выполняться в памяти и не попадало бы на диск, если пользователь специально не сохранил документ. Это возможно?

1 Ответ

68 голосов
/ 03 февраля 2009

На самом деле после того, как возиться с кучей разных образцов, все они невероятно запутаны и требуют использования пишущих документов, контейнеров, очередей печати и билетов на печать, я нашел статью Эрика Синкса о Печать в WPF
Упрощенный код длиной всего 10 строк

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

Мой пример довольно упрощен, он не включает в себя определение размера страницы и ориентацию, которая содержит целый ряд проблем, которые не работают так, как вы ожидаете. Также он не содержит никаких функций сохранения, так как MS, кажется, забыла включить кнопку «Сохранить» в Document Viewer.

Функция сохранения относительно проста (а также из статьи Эрика Синкса)

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

Таким образом, ответ - да, вы можете взять существующий элемент управления WPF (XAML), привязать его к базе данных и превратить в документ XPS - и это не так уж сложно.

...