2013-08-21 190 views
0

我尝试打印一封信,用于制作一个简单的字母合并应用程序。 但我关于如何设置WPF和.NET 4打印WPF信纸尺寸

这里内的打印机选项挣扎是我的代码:

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类我选择了手送纸盘,这是feeded与字母C5尺寸。它打印我的WPF,但不包含元素的正确位置。它像保证金一样检测A4纸的纸张尺寸。 即使我在PrintDialog中选择了C5的纸张大小,打印仍然超出范围。

任何想法如何适合C5的大小,以我的视觉印刷?这似乎像我的pd.PrintTicket.PageMediaSize设置为865px宽度和612px高度不起作用:/

回答

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); 
} 
相关问题