以Letter大小打印WPF

时间:2013-08-21 09:30:44

标签: c# .net wpf

我尝试打印一封用于制作简单字母合并申请的信件。 但我很沮丧如何在WPF和.NET 4中设置打印机选项。

这是我的代码:

    private void button_Print_Click(object sender, RoutedEventArgs e)
    {
        PrintDialog pd = new PrintDialog();
        if (pd.ShowDialog() == true)
        {
            pd.PrintTicket.PageOrientation = PageOrientation.Landscape;
            pd.PrintTicket.PageMediaSize = new PageMediaSize(865, 612);
            pd.PrintVisual(canvas_Letter, "Letter Canvas");
        }
    }

在PrintDialog中,我选择了MP托盘,其中装有C5大小的字母。它打印我的WPF,但没有正确的元素位置。它像边距检测到A4纸的纸张尺寸。 即使我在PrintDialog中选择C5的纸张尺寸,打印仍然不在界限内。

知道如何将C5的大小与我的视觉效果相匹配吗?看起来我的pd.PrintTicket.PageMediaSize设置为865px宽度和612px高度不起作用:/

1 个答案:

答案 0 :(得分:0)

不确定我是否理解你的问题。是否要打印出调整为所选纸张尺寸的canvas_Letter? 在这种情况下,我认为你必须使用'PrintCapabilities',你必须在canvas_Letter上调用Measure()和Arrange()。

这样的事情:

PrintDialog pd = new PrintDialog();
if (pd.ShowDialog() == true)
{
   Rect printableArea = GetPrintableArea(printDlg);

   // I'm using here a viewbox for easily adjust the canvas_Letter to the desired size
   Viewbox viewBox = new Viewbox { Child = canvas_Letter };
   viewBox.Measure(printableArea.Size);
   viewBox.Arrange(printableArea);
   printDlg.PrintVisual(viewBox, "Letter Canvas");
}

private static Rect GetPrintableArea(PrintDialog printDialog)
{
   PrintCapabilities cap;
   try
   {
      cap = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
   }
   catch (PrintQueueException)
   {
      return Rect.Empty;
   }

   if (cap.PageImageableArea == null)
   {
      return Rect.Empty;
   }

   var leftMargin = cap.OrientedPageMediaWidth.HasValue ? (cap.OrientedPageMediaWidth.Value - cap.PageImageableArea.ExtentWidth) / 2 : 0;
   var topMargin = cap.OrientedPageMediaHeight.HasValue ? (cap.OrientedPageMediaHeight.Value - cap.PageImageableArea.ExtentHeight) / 2 : 0;
   var width = cap.PageImageableArea.ExtentWidth;
   var height = cap.PageImageableArea.ExtentHeight;
   return new Rect(leftMargin, topMargin, width, height);
}