it-swarm-pt.tech

Converter controle WPF (XAML) em documento XPS

Posso usar um controle WPF (XAML) existente, vinculá-lo e transformá-lo em um documento XPS que pode ser exibido e impresso usando o Visualizador de documentos WPF XPS? Se sim, como? Caso contrário, como devo fazer os 'relatórios' no WPF usando XPS/PDF/etc?

Basicamente, quero usar um controle WPF existente, vinculá-lo para obter dados úteis e torná-lo imprimível e salvável para o usuário final. Idealmente, a criação do documento seria feita na memória e não atingiria o disco, a menos que o usuário salvasse o documento especificamente. Isso é viável?

46
Scott

Na verdade, depois de mexer com montes de amostras diferentes, todos incrivelmente complicados e exigem o uso de Gravadores de documentos, Contêineres, Filas de impressão e Tickets de impressão, encontrei o artigo de Eric Sinks sobre Impressão no WPF
O código simplificado tem apenas 10 linhas

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

Minha amostra é bastante simplista, não inclui o dimensionamento e orientação da página, que contém um conjunto totalmente diferente de problemas que não funcionam como o esperado. Também não contém nenhuma funcionalidade de salvamento, pois a Microsoft parece ter esquecido de incluir um botão Salvar no Visualizador de Documentos.

Salvar funcionalidade é relativamente simples (e também é do artigo de 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();
 }
}

Portanto, a resposta é Sim, você pode pegar um Controle WPF (XAML) existente, vinculá-lo e transformá-lo em um documento XPS - e não é tão difícil assim.

68
Scott