web-dev-qa-db-ja.com

WPF(XAML)コントロールをXPSドキュメントに変換

既存のWPF(XAML)コントロールを取得してデータバインドし、WPF XPSドキュメントビューアーを使用して表示および印刷できるXPSドキュメントに変換できますか?もしそうなら、どのように?そうでない場合、XPS/PDF /などを使用してWPFで「レポート」をどのように行う必要がありますか?

基本的に、既存のWPFコントロールを取得し、それをデータバインドして有用なデータを取得し、エンドユーザーが印刷および保存できるようにします。理想的には、ドキュメントの作成はメモリ内で行われ、ユーザーがドキュメントを特別に保存しない限りディスクにヒットしません。これは可能ですか?

46
Scott

実際、さまざまなサンプルの山をいじくり回した後、そのすべてが非常に複雑で、ドキュメントライター、コンテナ、印刷キュー、および印刷チケットの使用を必要とするので、WPFでの Printing
単純化されたコードはわずか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に[保存]ボタンを含めることを忘れているため、保存機能も含まれていません。

保存機能は比較的単純です(また、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();
 }
}

そのため、答えは「はい」です。既存のWPF(XAML)コントロールを取得してデータバインドし、XPSドキュメントに変換することができます。

68
Scott