Преобразовать элемент управления WPF (XAML) в документ XPS
Могу ли я взять существующий элемент управления WPF (XAML), связать его с данными и превратить в документ XPS, который можно отобразить и распечатать с помощью средства просмотра документов WPF XPS? Если так, то как? Если нет, то как мне делать "отчеты" в WPF с использованием XPS/PDF/etc?
По сути, я хочу взять существующий элемент управления WPF, связать его с данными, чтобы вставить в него полезные данные, а затем сделать его пригодным для печати и сохранения для конечного пользователя. В идеале создание документа должно выполняться в памяти и не попадать на диск, если пользователь не сохранит документ. Это возможно?
1 ответ
На самом деле, после того, как я возился с кучей разных образцов, каждый из которых невероятно запутан и требует использования устройства записи документов, контейнеров, очередей печати и билетов на печать, я нашел статью Эрика Синкса о печати в 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, кажется, забыла включить кнопку Сохранить в Document Viewer.
Функция сохранения относительно проста (а также из статьи Эрика Синкса)
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 - и это не так уж сложно.