Convertir le contrôle WPF (XAML) en Document XPS
puis-je prendre un contrôle WPF (XAML) existant, le databind et le transformer en un document XPS qui peut être affiché et imprimé en utilisant le WPF XPS Document Viewer? Si oui, comment? Si ce n'est pas le cas, comment dois-je procéder pour "faire rapport" dans le cadre du FPF en utilisant XPS/PDF/etc?
Fondamentalement, je veux prendre un contrôle WPF, databind pour obtenir des données utiles, et ensuite à le rendre imprimable et saveable pour l'utilisateur final. Idéalement, la création du document se ferait en mémoire et ne toucherait pas le disque sauf si l'Utilisateur a sauvegardé le document. Est-ce faisable?
1 réponses
en fait, après avoir joué avec des tas de différents échantillons, qui sont tous incroyablement alambiqués et nécessitent l'utilisation de rédacteurs de documents, des conteneurs, des files d'attente D'impression et des Tickets D'impression, J'ai trouvé L'article D'Eric Sinks à propos de Impression en WPF
Le code simplifié n'a que 10 lignes de long
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;
}
mon échantillon est assez simpliste, il ne comprend pas la taille de la Page et L'Orientation qui contient un ensemble tout à fait différent de questions qui ne fonctionnent pas comme vous attendez. Ni ne contient aucune save fonctionnalités que MS semblent avoir oublié d'inclure un bouton "Enregistrer" avec la Visionneuse de documents.
Enregistrer la Fonctionnalité est relativement simple (et qui est aussi à partir de Eric Puits de l'article)
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();
}
}
donc la réponse est oui, vous pouvez prendre un contrôle WPF (XAML) existant, le databind et le transformer en un document XPS - et ce n'est pas si difficile.