在横向打印WPF视觉图像时,打印机仍以纵向尺寸进行剪辑

在横向打印WPF视觉图像时,打印机仍以纵向尺寸进行剪辑,wpf,printing,Wpf,Printing,我已经编写了一个小应用程序,它以编程方式创建了一个视觉效果,我正在尝试以横向方式将其打印在页面上(它以纵向方式剪辑)。当我打印时,它确实是以横向的方式显示出来的,但我的视觉仍然被剪裁,因为它仅限于纵向 这是我的密码: StackPanel page = new StackPanel(); // ... generate stuff to the page to create the visual PrintDialog dialog = new PrintDialog(); // System

我已经编写了一个小应用程序,它以编程方式创建了一个视觉效果,我正在尝试以横向方式将其打印在页面上(它以纵向方式剪辑)。当我打印时,它确实是以横向的方式显示出来的,但我的视觉仍然被剪裁,因为它仅限于纵向

这是我的密码:

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的宽度,从而切断了大量内容。我用另一张纸盖在打印的纸上检查了这一点,它非常适合里面


我在测量和安排控件时有没有做错什么?如何让我的打印机使用横向定向的全部空间?

横向视觉打印有一个已知的问题。这应该提供如何解决的细节

描述核心问题是正确的(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");
}
试一试


我尝试使用这里描述的方法(使用XpsDocumentWriter和新创建的PrintTicket),但遇到了几乎相同的问题。我非常努力。你的建议解决了我的问题。谢谢
PrintDialog printDlg = new PrintDialog();
PrintTicket pt = printDlg.PrintTicket;
pt.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA5Rotated);