c# - tutorial - xaml elements
Convierta el control de WPF(XAML) al documento de XPS (1)
En realidad, después de jugar con montones de muestras diferentes, todas ellas increíblemente intrincadas y que requieren el uso de Escritores de Documentos, Contenedores, Colas de Impresión e Imprimir Boletos, encontré el artículo de Eric Sinks sobre Impresión en WPF
El código simplificado es de apenas 10 líneas de largo
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;
}
Mi muestra es bastante simplista, no incluye el tamaño de página y la orientación, que contiene un conjunto diferente de problemas que no funcionan como era de esperar. Tampoco contiene ninguna funcionalidad de guardado ya que MS parece haber olvidado incluir un botón Guardar con el Visor de documentos.
La funcionalidad de guardar es relativamente simple (y también es del artículo de 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();
}
}
Entonces, la respuesta es Sí, puede tomar un control WPF (XAML) existente, enlazarlo y convertirlo en un documento XPS, y no es tan difícil.
¿Puedo tomar un control WPF (XAML) existente, relacionarlo y convertirlo en un documento XPS que pueda mostrarse e imprimirse con el visor de documentos XPS de WPF? ¿Si es así, cómo? Si no, ¿cómo debería estar ''informando'' en WPF usando XPS / PDF / etc.?
Básicamente, quiero tomar un control WPF existente, vincularlo con datos para obtener datos útiles y luego hacerlos imprimibles y guardables para el usuario final. Idealmente, la creación del documento se haría en la memoria y no golpearía el disco a menos que el usuario guardara el documento específicamente. ¿Es esto factible?