0

我尝试打印一封信来制作一个简单的信函合并应用程序。但我在如何在 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,但没有使用元素的正确位置。就像 Margin 检测 A4 纸的纸张大小一样。即使我在 PrintDialog 中选择 C5 的纸张大小,打印仍然超出范围。

知道如何使 C5 的尺寸适合我的视觉打印吗?似乎我的 pd.PrintTicket.PageMediaSize 设置为 865px 宽度和 612px 高度不起作用:/

4

1 回答 1

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);
}
于 2013-08-22T05:51:24.083 回答