打印ScrollViewer内容

时间:2012-01-02 16:07:56

标签: wpf printing

我有以下内容: 带有滚动查看器和打印按钮的wpf窗口。

我正在尝试使用PrintDialog打印scrollviewer的内容,但它仅适用于xps。如果我选择我的打印机或文档编写器,那么最终结果很糟糕(半页边距,控件剪切等)。 如何在不调整/缩放滚动查看器内容的情况下解决此问题?

2 个答案:

答案 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");
}