2012-01-02 17 views
4

私は次のものを持っています: スクロールビューワとプリントボタンを備えたwpfウィンドウ。ScrollViewerの内容を印刷する

私はPrintDialogを使ってscrollviewerの内容を印刷しようとしていますが、xpsでしか動作しません。私のプリンタや文書作成者を選択すると、最終的な結果はひどいものになります(半分のページ余白、コントロールカットなど)。 スクロールビューアのコンテンツのサイズを変更せずにこの問題を解決するにはどうすればよいですか?

答えて

3

WPFでまともで(比較的簡単な)印刷を行うには、ScrollViewerの代わりにFlowDocumentScrollViewerを使用する必要があります。 FlowDocumentScrollViewerの内部に、FlowDocumentを配置します。この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インチに相当します。 (96dpi)。

サンプル印刷コード:

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

ありがとうございます。コードは最初のページを生成して印刷しますが、コンテンツはまだカットされています。いくつかのマージンを調整する必要がありますか? – phm

+0

@phm - いくつかのスクリーンショットやコードを投稿できるので、問題の内容を正確に確認できますか? – Stewbob

1

FlowDocumentはおそらく知られていない動的コンテンツと動的なプリントサイズ、すなわちいずれかのためのよりよい解決策であるか、または変更することができます。私の問題では、内容と印刷サイズの両方を知っていました。

私は、ScrollViewerの内のコンテンツを設定し、私の場合は、グリッド、

<Grid x:Name="gridReport" Height=”29.7cm” Width=”21cm”> 

で簡単に行うことができますA4サイズにこれは、グリッドは何でも、印刷領域に正確にマッピングさを意味してなかった最初のもの印刷時にグリッド内に歪みがあってはならない。

PrintDialogを使用した時点でScrollViewerがスクロールされていない場合は、これでも上部領域がチョップされます。これをプログラムで解決するには、印刷前に上部にスクロールしてください。

Myscrollviewer.ScrollToTop(); 

PrintDialog printDialog = new PrintDialog(); 
if(printDialog.ShowDialog() == true) 
{ 
    printDialog.PrintVisual(gridReport, "Print Report"); 
} 
関連する問題