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 で、C5 サイズの文字が供給される MP トレイを選択します。私のWPFを印刷しますが、要素の正しい位置ではありません。Margin が A4 用紙の用紙サイズを検出するようなものです。PrintDialog で C5 の用紙サイズを選択しても、印刷は範囲外です。

C5のサイズをビジュアルプリントに合わせる方法はありますか? 幅865px、高さ612pxに設定されたpd.PrintTicket.PageMediaSizeが機能しないようです:/

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 に答える