2013-08-21 2 views
0

Я пытаюсь напечатать письмо для создания простого приложения слияния букв. Но я изо всех сил о том, как настроить параметры принтера внутри WPF и .NET 4.Печать WPF в формате Letter

Вот мой код:

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 я выбираю МЦ лоток, который поданого с буквами C5. Его печать моего WPF, но не с правильными позициями элементов. Его, как маржа, определяет размер бумаги A4. Даже если я выбираю формат бумаги C5 в PrintDialog, печать все равно выходит за рамки.

Любая идея, как подогнать размер C5 к моей визуальной печати? Похоже, что мой pd.PrintTicket.PageMediaSize установлен на ширину 865 пикселей и высоту 612 пикселей не работает:/

ответ

0

Не уверен, что я правильно понимаю ваш вопрос. Вы хотите распечатать свой файл canvas_Letter в соответствии с выбранным размером бумаги? В этом случае, я думаю, вы должны использовать «PrintCapabilities», и вам еще нужно вызвать Measure() и Arrange() на вашем canvas_Letter.

Что-то вроде этого:

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); 
} 
Смежные вопросы