2009-02-02 87 views
42

我可以使用現有的WPF(XAML)控件將其數據綁定並將其轉換爲可使用WPF XPS文檔查看器顯示和打印的XPS文檔? 如果是這樣,怎麼樣? 如果不是,我應該如何使用XPS/PDF /等在WPF中進行「報告」?將WPF(XAML)控件轉換爲XPS文檔

基本上我想採取一個現有的WPF控件,數據綁定它獲得有用的數據,然後使其可打印和可保存爲最終用戶。理想情況下,文檔創建將在內存中完成,除非用戶專門保存了文檔,否則不會觸及磁盤。這是可行的嗎?

+0

[http://msdn.microsoft.com/en-us/library/system.windows.xps.visualstoxpsdocument.aspx](http://msdn.microsoft.com/en-us/library/system.windows .xps.visualstoxpsdocument.aspx) – 2009-02-02 05:20:17

回答

61

與不同樣品的堆,所有這一切都是令人難以置信的令人費解,並要求使用文檔作家,容器,打印隊列和打印門票亂搞後其實,我發現埃裏克匯文章關於Printing in 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似乎忘記了在文檔查看器中包含保存按鈕。

保存功能是相對簡單的(並且也爲埃裏克匯文章)

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文件 - 並不是那麼困難。

+1

您能否提供MyWPFControl和MyWPFControlDataSource的定義?沒有它們的示例代碼是毫無價值的,並且Sinks文章似乎沒有包含它們。 – 2009-12-14 21:58:10