【问题标题】:Print WPF in Letter size以 Letter 大小打印 WPF
【发布时间】:2013-08-21 09:30:43
【问题描述】:

我尝试打印一封信来制作一个简单的信函合并应用程序。 但我很纠结如何在 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 高度不起作用:/

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:

    不确定我是否正确理解了您的问题。你想打印出你的 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多