FlexGrid for WPF
高度な印刷
印刷のサポート > 高度な印刷

印刷処理をさらに細かく制御する場合は、GetPageImages メソッドを使用してグリッドを自動的にいくつかの画像に分割し、各画像を個別のページにレンダリングできます。各画像はグリッドの一部を 100% 正確に表現し、スタイル、カスタム要素、各ページに繰り返し表示される行ヘッダーと列ヘッダーなどを含みます。

GetPageImages メソッドを使用して、呼び出し元は、画像を拡大縮小することもできます。これにより、グリッド全体を実際のサイズでレンダリングしたり、1 ページに収まるように、または 1 ページの幅に合わせて拡大縮小することができます。

ページ画像を取得したら、WPF の印刷のサポートを使用して、それらを柔軟にドキュメントにレンダリングできます。たとえば、複数のグリッド、チャートなどのコンテンツを含むドキュメントを作成できます。また、ヘッダーやフッターをカスタマイズしたり、レターヘッドを追加することもできます。

WPF の印刷フレームワークは異なっています。以下のセクションでは、GetPageImages を使用して印刷ドキュメントに C1FlexGrid をレンダリングする方法を示します。

WPF での C1FlexGrid の印刷

WPF でドキュメントを印刷する場合は、Silverlight の場合と多少異なる手順を実行する必要があります。

  1. PrintDialog オブジェクトを作成します。
  2. ダイアログボックスの ShowDialog メソッドが true を返す場合は、次の手順を実行します。
  3. ドキュメントのコンテンツを提供する Paginator オブジェクトを作成します。
  4. ダイアログの PrintDocument メソッドを呼び出します。

次のコードは、このメカニズムのサンプル実装です。また、このコードは製品サンプルのPrintingWPFを参考にしてください。

C#
コードのコピー
// 詳細な印刷操作
void _btnAdvancedPrint_Click(object sender, RoutedEventArgs e)
{
  var pd = new PrintDialog();
  if (pd.ShowDialog().Value)
  {
    // スケールモードと余白を取得します。
   var margin =
     _cmbMargins.SelectedIndex == 0 ? 96.0 / 4 :
     _cmbMargins.SelectedIndex == 1 ? 96.0 / 2 :
     96.0;
   var scaleMode =
     _cmbZoom.SelectedIndex == 0 ? ScaleMode.ActualSize :
     _cmbZoom.SelectedIndex == 1 ? ScaleMode.PageWidth :
     ScaleMode.SinglePage;
    // ページサイズを計算します。
    var sz = new Size(pd.PrintableAreaWidth,
                            pd.PrintableAreaHeight);
    // ページングを設定します。
    var paginator = new FlexPaginator(
      _flex, ScaleMode, sz, new  Thickness(margin), 100);
    // ドキュメントを印刷します
    pd.PrintDocument(paginator, "C1FlexGrid 印刷デモ");
  }
}

FlexPaginator クラスは、ページ画像を提供し、概念的には Silverlight で使用される PrintPage イベントハンドラに似ています。このクラスは次のように実装されます。

C#
コードのコピー
/// <summary>
/// C1FlexGrid コントロールをレンダリングするために使用される DocumentPaginator クラス。
/// </summary>
public class FlexPaginator : DocumentPaginator
{
  Thickness _margin;
  Size _pageSize;
  ScaleMode _scaleMode;
  List<FrameworkElement> _pages;
  public FlexPaginator(C1FlexGrid flex,
    ScaleMode scaleMode,
    Size pageSize,
    Thickness margin, int maxPages)
  {
    // 引数を保存します。
    _margin = margin;
    _scaleMode = scaleMode;
    _pageSize = pageSize;
    // グリッド画像を作成する前に、ページサイズで余白を調整します。
    pageSize.Width -= (margin.Left + margin.Right);
    pageSize.Height -= (margin.Top + margin.Bottom);
    // 各ページのグリッド画像を取得します。
    _pages = flex.GetPageImages(scaleMode, pageSize, maxPages);
  }

このコンストラクタは、ページ画像を作成します。これらの画像は、後で印刷フレームワークがページネータの GetPage メソッドを呼び出すときに、ページにレンダリングされます。

C#
コードのコピー
public override DocumentPage GetPage(int pageNumber)
  {
    // ページ要素を作成します。
    var pageTemplate = new PageTemplate();
    // 余白を設定します。
    pageTemplate.SetPageMargin(_margin);
    // 内容を設定します。
    pageTemplate.PageContent.Child = _pages[pageNumber];
    pageTemplate.PageContent.Stretch =
      _scaleMode == ScaleMode.ActualSize
        ? System.Windows.Media.Stretch.None
        : System.Windows.Media.Stretch.Uniform;
    // フッタテキストを設定します。
    pageTemplate.FooterRight.Text = string.Format("ページ {0} / {1}",
        pageNumber + 1, _pages.Count);
    // ページ要素を整理します。
    pageTemplate.Arrange(
        new Rect(0, 0, _pageSize.Width, _pageSize.Height));
    // 新しいドキュメントを作成します。
    return new DocumentPage(pageTemplate);
  }

前の例と同様に、PageTemplate ヘルパークラスを使用して、グリッド画像を保持し、マージン、ヘッダ、およびフッタを提供します。

残りのページネータメソッドは、細かい実装を行います。

コードのコピー
public override int PageCount
  {
    get { return _pages.Count; }
  }
  public override IDocumentPaginatorSource Source
  {
    get { return null; }
  }
  public override Size PageSize
  {
    get { return _pageSize; }
    set { throw new NotImplementedException(); }
  }
  public override bool IsPageCountValid
  {
    get { return true; }
  }
}

次の図は、グリッドが XPS ファイルにレンダリングされた場合のドキュメントです。このサンプルで使用したカスタムの評価セルも含めて、正確に示されています。行および列ヘッダ、単純なページヘッダ、および標準の "ページ n/m" ページフッタは、自動的にすべてのページに含まれます。

関連トピック