2013-08-21 238 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); 
} 
相關問題