2009-02-02 3 views
42

Tôi có thể kiểm soát WPF hiện tại (XAML), databind và biến nó thành tài liệu XPS có thể được hiển thị và in bằng Trình xem tài liệu WPF XPS không? Nếu có, làm thế nào? Nếu không, tôi nên làm ‘báo cáo’ trong WPF bằng cách sử dụng XPS/PDF/etc như thế nào?Chuyển đổi điều khiển WPF (XAML) sang tài liệu XPS

Về cơ bản tôi muốn kiểm soát WPF hiện có, databind nó để có được dữ liệu hữu ích vào nó và sau đó làm cho nó có thể in và saveable cho người dùng cuối. Lý tưởng nhất là việc tạo tài liệu sẽ được thực hiện trong bộ nhớ và sẽ không nhấn vào đĩa trừ khi người dùng lưu tài liệu cụ thể. Điều này có khả thi không?

+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) –

Trả lời

61

Trên thực tế sau khi rối tung xung quanh với đống các mẫu khác nhau, tất cả đều vô cùng phức tạp và đòi hỏi việc sử dụng các tài liệu Nhà văn, Container, Queues In và In Vé, tôi thấy bài viết Eric Sinks về Printing in WPF
Mã đơn giản là một chỉ 10 dòng dài

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

Mẫu của tôi khá đơn giản, không bao gồm Định cỡ và định hướng trang chứa toàn bộ các vấn đề khác nhau không hoạt động như bạn mong đợi. Cũng không chứa bất kỳ chức năng tiết kiệm nào như MS dường như đã quên bao gồm nút Lưu với Trình xem tài liệu.

Lưu năng là tương đối đơn giản (và cũng có thể là từ bài viết 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(); 
} 
} 

Vì vậy, câu trả lời là Có, bạn có thể mất một WPF hiện tại (XAML) Kiểm soát, DataBind nó và biến nó thành một XPS tài liệu - và nó không phải tất cả những khó khăn.

+1

Bạn có thể vui lòng cung cấp các định nghĩa cho MyWPFControl và MyWPFControlDataSource ??? Mã ví dụ là vô giá trị mà không có chúng và bài viết Sinks dường như không chứa chúng. –

+6

Jim, MyWPFControl là bất kỳ điều khiển nào (tùy chỉnh, tổng hợp, độc lập hoặc cách khác) mà bạn muốn hiển thị dưới dạng trang trong tài liệu XPS của mình. MyWPFControlDataSource rõ ràng là bất kỳ dữ liệu nào, (thường là một ViewModel), bạn muốn liên kết với điều khiển đó. Ví dụ đã được cố ý để lại dưới dạng chung để hữu ích cho bất kỳ ai nhìn vào nó, không chỉ ai đó tìm cách để hiển thị một điều khiển cụ thể cho xaml. – Scott

+0

Đây là một ngày may mắn, được tìm thấy trong câu trả lời đơn giản của bạn, giải pháp của hai vấn đề của tôi trong tuần này. –