当前位置:  开发笔记 > 编程语言 > 正文

将WPF(XAML)控件转换为XPS文档

如何解决《将WPF(XAML)控件转换为XPS文档》经验,为你挑选了1个好方法。

我可以使用现有的WPF(XAML)控件,对其进行数据绑定并将其转换为可以使用WPF XPS文档查看器显示和打印的XPS文档吗?如果是这样,怎么样?如果没有,我应该如何使用XPS/PDF /等在WPF中进行"报告"?

基本上我想采用现有的WPF控件,数据绑定它以获取有用的数据,然后使其可打印并可供最终用户保存.理想情况下,文档创建将在内存中完成,除非用户专门保存文档,否则不会访问磁盘.这可行吗?



1> Scott..:

事实上,经过大量不同的样本,所有这些都令人难以置信的复杂,需要使用文档 编写器,容器,打印队列和打印票据,我发现Eric Sinks关于在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似乎忘记在文档查看器中包含"保存"按钮.

保存功能相对简单(也来自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 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文档 - 这并不是那么困难.


Jim,MyWPFControl是您希望在XPS文档中呈现为页面的任何控件(自定义,复合,独立或其他).MyWPFControlDataSource显然是要绑定到该控件的任何数据(通常是ViewModel).故意将该示例保留为通用形式,以便对于任何查看它的人都有用,而不仅仅是想要为xaml呈现特定控件的人.
这是使用大型WPF控件还是我需要为多个分页添加一些额外的代码?
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有