我有以下内容: 带有滚动查看器和打印按钮的wpf窗口。
我正在尝试使用PrintDialog打印scrollviewer的内容,但它仅适用于xps。如果我选择我的打印机或文档编写器,那么最终结果很糟糕(半页边距,控件剪切等)。 如何在不调整/缩放滚动查看器内容的情况下解决此问题?
答案 0 :(得分:4)
对于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'对象非常适合保存可包含您需要的任何内容的usercontrol。 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
答案 1 :(得分:1)
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");
}