3

プログラムでビジュアルを作成する小さなアプリを作成しましたが、横向きのページに印刷しようとしています (縦向きにクリップされます)。印刷すると横向きになりますが、縦向きに制限されていたため、ビジュアルはまだ切り取られています。

これが私のコードです:

StackPanel page = new StackPanel();
// ... generate stuff to the page to create the visual

PrintDialog dialog = new PrintDialog(); // System.Windows.Controls.PrintDialog
bool? result = dialog.ShowDialog();
if(result.HasValue && result.Value)
{
    dialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
    Size pageSize = new Size { Width = dialog.PrintableAreaWidth, 
        Height = dialog.PrintableAreaHeight };
    // pageSize comes out to {1056, 816}, which is the orientation I expect
    page.Measure(pageSize); 
    // after this, page.DesiredSize is e.g. {944, 657}, wider than portrait (816).
    page.UpdateLayout();
    dialog.PrintVisual(page, "Job description");
}

これを実行した後、印刷されたコンテンツは正しく配置されますが、依然として 816 の幅にクリップされているように見え、コンテンツのかなりの部分が切り取られています。印刷された紙の上に別の紙をかざしてこれを確認したところ、完全に収まりました。

コントロールを測定して配置するのに間違っていることはありますか? プリンターが横向きの全スペースを使用できるようにするにはどうすればよいですか?

4

3 に答える 3

5

Steve Py の回答は、コアの問題を説明するのに正しかったです (PrintVisual は使用される PrintTicket 設定を尊重しません)。ただし、XpsDocumentWriter と新しい PrintTicket を使用してみましたが、同じ問題に遭遇しました (新しい PrintTicket の向きを横向きに設定しても、まだ切り取られていました)。

代わりに、LayoutTransform を設定してコンテンツを 90 度回転させ、ポートレート モードで印刷することで、この問題を回避しました。私の最終的なコード:

StackPanel page = new StackPanel();
// ... generate stuff to the page to create the visual
// rotate page content 90 degrees to fit onto a landscape page
RotateTransform deg90 = new RotateTransform(90);
page.LayoutTransform = deg90;

PrintDialog dialog = new PrintDialog();
bool? result = dialog.ShowDialog();
if (result.HasValue && result.Value)
{
    Size pageSize = new Size { Height = dialog.PrintableAreaHeight, Width = dialog.PrintableAreaWidth };
    page.Measure(pageSize);
    page.UpdateLayout();
    dialog.PrintVisual(page, "Bingo Board");
}
于 2012-10-08T07:13:49.143 に答える
2

ランドスケープ ビジュアル印刷に関する既知の問題があります。これは、それに対処する方法の詳細を提供する必要があります。

http://social.msdn.microsoft.com/Forums/en/wpf/thread/56fb78b1-efc2-4ff7-aa2c-73c198a790b4

于 2012-10-08T03:44:11.313 に答える