我有以下内容:一个带有滚动查看器和打印按钮的wpf窗口。
我正在尝试使用PrintDialog打印滚动查看器的内容,但它只适用于xps。如果我选择我的打印机或文档书写器,那么最终的结果是可怕的(半页边距,控制剪切等)。如何解决这个问题,而不调整/缩放滚动查看器的内容?
要在WPF中进行体面(并且相对容易)的打印,您应该使用FlowDocumentScrollViewer而不是ScrollViewer。在FlowDocumentScrollViewer中,你可以放置一个FlowDocument,它将包含你想要打印的内容。
样本XAML:<FlowDocumentScrollViewer>
<FlowDocument PagePadding="48">
<Section>
<Paragraph>
<Run Text="sample"/>
</Paragraph>
</Section>
<Section>
<BlockUIContainer>
<my:myUserControl/>
</BlockUIContainer>
</Section>
</FlowDocument>
</FlowDocumentScrollViewer>
'BlockUIContainer'对象是伟大的容纳一个用户控件,可以包含任何你需要的。FlowDocument的"PagePadding"属性设置页边距。48等于1/2英寸。(96 dpi)。
示例打印代码:
Dim pd As New PrintDialog
If pd.ShowDialog Then
Dim fd As FlowDocument = docOutput
Dim pg As DocumentPaginator = CType(fd, IDocumentPaginatorSource).DocumentPaginator
pd.PrintDocument(pg, "my document")
End If
FlowDocument可能是动态内容和动态打印尺寸的更好解决方案,即要么是未知的,要么可能会改变。对于我的问题,我知道内容和打印尺寸。
我做的第一件事是将ScrollViewer中的内容(在我的例子中是一个网格)设置为A4大小,这可以通过
轻松完成。<Grid x:Name="gridReport" Height="29.7cm" Width="21cm">
这意味着网格完全映射到打印区域,无论网格内的是什么,在打印时都不应该被扭曲。
如果在使用PrintDialog时ScrollViewer没有滚动到顶部,这仍然会切断顶部区域。若要以编程方式解决此问题,请在使用
打印前滚动到顶部Myscrollviewer.ScrollToTop();
PrintDialog printDialog = new PrintDialog();
if(printDialog.ShowDialog() == true)
{
printDialog.PrintVisual(gridReport, "Print Report");
}