c95*_*mbq 4 printing wpf xps preview
我读的关于这个主题越多,我理解的就越少,所以如果下面看起来完全不在墙上,请提前道歉.
我有一个包含flowdocument的usercontrol - 一个带有相应viewmodel的视图.目的是将其发送到预览窗口,用户可以在该窗口中查看文档并进行打印.
我从http://www.eggheadcafe.com/tutorials/aspnet/9cbb4841-8677-49e9-a3a8-46031e699b2e/wpf-printing-and-print-pr.aspx的示例中提取了一些代码.
当调用以下内容时
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
Run Code Online (Sandbox Code Playgroud)
这将打开打印预览窗口并显示保存flowdocument的用户控件.但是,它只显示应该是多个页面的第一个.我是在假设编写xps然后在这个窗口中再次阅读它的全部内容是解决打印视觉的问题,但我显然误解了整个过程.为了能够查看文档中的所有页面,我需要做的任何帮助,以了解我需要做的事情,我将不胜感激.
干杯
我认为上面使用xpsdocument和getfixeddocumentsequence将flowdocument转换为fixeddocument但看到它没有,我可能写错了吗?
您可以将视觉效果打印到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();
Run Code Online (Sandbox Code Playgroud)
此外,请注意,如果您正在新建视觉并打印它,则需要先调整大小,否则可能会出现空白屏幕.这是生成数据页面的示例(当然,您要更改尺寸以适合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;
}
Run Code Online (Sandbox Code Playgroud)