2009-02-02 10 views
42

Mogę wziąć istniejącym WPF (XAML) sterowania, DataBind go i przekształcić go w dokumencie XPS, które mogą być wyświetlane i drukowane przy użyciu WPF XPS Document Viewer? Jeśli tak, w jaki sposób? Jeśli nie, jak powinienem robić "raportowanie" w WPF przy użyciu XPS/PDF/etc?Konwersja WPF (XAML) Sterowanie do XPS Document

Zasadniczo chcę brać istniejącej kontroli WPF, DataBind to, aby uzyskać wartościowe dane w nim i następnie uczynić go do druku i saveable dla użytkownika końcowego. Najlepiej byłoby, gdyby tworzenie dokumentu zostało wykonane w pamięci i nie trafiłoby na dysk, chyba że użytkownik specjalnie zapisał dokument. Czy to możliwe?

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

Odpowiedz

61

Faktycznie po aprowizacji z stert różnych próbek, z których wszystkie są bardzo zawiłe i wymagają użycia dokumentu Writers, kontenerów, kolejek wydruku oraz Bilety druk, znalazłem artykuł Eric Zlewy o Printing in WPF
Kod uproszczony jest zaledwie 10 wierszy długie

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

Moja próbka jest dość proste, to nie obejmuje stronę doborze i orientacji, która zawiera całe inny zestaw problemów, które nie pracują, jak można by oczekiwać. Nie zawiera też żadnych funkcji składowania, ponieważ MS zapomniało włączyć przycisk Zapisz w przeglądarce dokumentów.

Zapisz Funkcjonalność jest stosunkowo proste (i jest również z Eric Zlewozmywak artykułu)

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

Więc odpowiedź brzmi: tak, można wziąć istniejącego WPF (XAML) sterowania, DataBind go i przekształcić go w XPS dokument - i nie jest to wcale takie trudne.

+1

Czy mógłbyś podać definicje MyWPFControl i MyWPFControlDataSource ??? Przykładowy kod jest bezwartościowy bez nich, a artykuł Sinks nie zawiera ich. –

+6

Jim MyWPFControl ma żadnej kontroli (na zamówienie, kompozytowe, samodzielny lub w inny sposób), które chcesz aby były one przetworzone jako strony w dokumencie XPS. MyWPFControlDataSource to oczywiście dowolne dane (zwykle ViewModel), które chcesz powiązać z tym sterowaniem. Przykład celowo został pozostawiony w formie ogólnej, aby był przydatny dla każdego, kto się na niego patrzy, a nie tylko dla kogoś, kto chciałby wyrenderować określoną kontrolę nad xaml. – Scott

+0

To szczęśliwy dzień, znaleziony w twojej wspaniałej, prostej odpowiedzi na rozwiązanie dwóch moich problemów na ten tydzień. –