2012-01-02 196 views
4

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

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

回答

3

为了在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 
+1

感谢您的意见。该代码生成并打印第一页,但内容仍然被剪切。我是否需要调整一些边距或w/h? – phm 2012-01-03 09:36:38

+0

@phm - 你可以发布一些截图和/或代码,所以我们可以确切地看到问题是什么? – Stewbob 2012-01-03 13:44:46

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