我读到的关于这个主题的内容越多,我就越不明白,如果以下看起来完全不合适,请提前道歉。
我有一个包含flowdocument的usercontrol - 一个带有相应viewmodel的视图。目的是将其发送到预览窗口,用户可以在该窗口中查看文档并进行打印。
的示例中提取了一些代码以下称为
Public Shared Sub PrintPreview(owner As Window, data As FormData)
Using xpsStream As New MemoryStream()
Using package__1 As Package = Package.Open(xpsStream, FileMode.Create, FileAccess.ReadWrite)
Dim packageUriString As String = "memorystream://data.xps"
Dim packageUri As New Uri(packageUriString)
PackageStore.AddPackage(packageUri, package__1)
Dim xpsDocument__2 As New XpsDocument(package__1, CompressionOption.Maximum, packageUriString)
Dim writer As XpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDocument__2)
Dim visual As New Form(data)
Dim printTicket As New PrintTicket()
printTicket.PageMediaSize = A4PaperSize
writer.Write(visual, printTicket)
Dim document As FixedDocumentSequence = xpsDocument__2.GetFixedDocumentSequence()
xpsDocument__2.Close()
Dim printPreviewWnd As New PrintPreviewWindow(document)
printPreviewWnd.Owner = owner
printPreviewWnd.ShowDialog()
PackageStore.RemovePackage(packageUri)
End Using
End Using
这将打开打印预览窗口并显示保存flowdocument的用户控件。但是,它只显示应该是多个页面的第一个。我是在假设编写xps然后在这个窗口中再次阅读它的全部要点是解决打印视觉问题,但我显然误解了整个过程。如果能够查看文档中的所有页面,我需要做的任何帮助才能通过我的厚头脑。非常感谢。
干杯
我认为上面使用xpsdocument和getfixeddocumentsequence会将flowdocument转换为fixeddocument,但是看不到,我可能写错了吗?
答案 0 :(得分:6)
您可以将视觉效果打印到XPS。但是,据我所知,管理页面是你的工作。如果您的视觉效果太大而无法放在页面上,则需要找到将其拆分为多个页面的方法。
我在这里发布的源代码打印了许多页面上的项目列表:
https://bitbucket.org/paulstovell/samples/src/a323f0c65ea4/XPS%20Report%20Generator/
如果您可以找到一种方法来分割您的视觉效果(可能创建3个表单,每个表单15个项目)到页面中,您可以使用它:
using (var doc = new XpsDocument("P:\\Test2.xps", FileAccess.Write))
{
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
var collator = writer.CreateVisualsCollator();
collator.BeginBatchWrite();
collator.Write(form1);
collator.Write(form2);
collator.Write(form3);
collator.EndBatchWrite();
}
var doc2 = new XpsDocument("P:\\Test2.xps", FileAccess.Read);
var seq = doc2.GetFixedDocumentSequence();
var window = new Window();
window.Content = new DocumentViewer {Document = seq};
window.ShowDialog();
另外,请注意,如果您正在新建视觉效果并打印它,则需要先调整大小,否则可能会出现空白屏幕。这是一个生成数据页面的示例(当然,您可以更改尺寸以适合A4纸张。)
private StackPanel CreatePage()
{
var panel = new StackPanel();
panel.Width = 1000;
panel.Height = 1000;
for (var i = 0; i < 10; i++)
{
panel.Children.Add(new TextBlock() {Text = "Item " + i});
}
panel.Measure(new Size(1000, 1000));
panel.Arrange(new Rect(0, 0, 1000, 1000));
return panel;
}