'宣言 Public Event DrawingElement As System.EventHandler(Of DrawingElementEventArgs)
public event System.EventHandler<DrawingElementEventArgs> DrawingElement
イベント ハンドラが、このイベントに関連するデータを含む、DrawingElementEventArgs 型の引数を受け取りました。次の DrawingElementEventArgs プロパティには、このイベントの固有の情報が記載されます。
プロパティ | 解説 |
---|---|
Bounds | レンダリングされる要素の座標を取得します(論理ピクセル単位)。 |
DocumentTransform | 論理ピクセルと PDF ページ単位(ポイント)の間で座標を変換するために使用される System.Windows.Media.Transformを取得します。 |
Element | レンダリングされる要素への参照を取得します。 |
Handled | イベントハンドラが要素をレンダリングしたかどうかを判定する値を取得または設定します。 |
Root | レンダリングされる要素のルートへの参照を取得します。 |
このイベントは、 %DrawElement(FrameworkElement, Rect, Rect)%メソッドの呼び出し後にレンダリングされる System.Windows.FrameworkElementごとに発生します。このイベントを使用して、組み込みのレンダリング動作をオーバーライドし、特定の要素に対してカスタムコンテンツをレンダリングできます。
このイベントを処理する場合は、 DrawingElementEventArgs.Handledプロパティを true に設定して、コントロールがカスタムコンテンツの上に要素をレンダリングしないようにしてください。
次の例は、 DrawingElementイベントを使用して、タイプ 'RichTextBox' の要素に対してカスタムレンダリングを提供する方法を示します。このコードは、レンダリングされる要素のタイプをチェックします。要素が 'RichTextBox' である場合、このコードは、そのオブジェクトを表すための System.Windows.Media.Imaging.WriteableBitmapを作成してから、PDF ドキュメントに画像をレンダリングします。
これはかなり一般的な例です。これを使用して、 System.Windows.Controls.TextBlock、 System.Windows.Controls.Border、 System.Windows.Shapes.Rectangleなどの基本オブジェクトとして子要素を公開しない要素をレンダリングできます。
要素を画像としてレンダリングすることに伴う欠点は、出力にラスタ画像が含まれることです。ラスタ画像は、サイズがかなり大きくなり、PDF で拡大すると表示が荒くなることがあります。
// C1PdfDocument を作成します var pdf = new C1PdfDocument(PaperKind.Letter); // DrawingElement イベントを使用して RichTextBox 要素をレンダリングします pdf.DrawingElement += (s, e) => { if (e.Element is RichTextBox) { // 要素画像を取得します #if SILVERLIGHT var bmp = new WriteableBitmap(e.Element, e.DocumentTransform); #else // WPF var sz = e.Element.RenderSize; var rtBmp = new RenderTargetBitmap((int)sz.Width, (int)sz.Height, 96, 96, PixelFormats.Pbgra32); rtBmp.Render(e.Element); var bmp = new WriteableBitmap(rtBmp); #endif // ドキュメントにレンダリングします pdf.DrawImage(bmp, e.Bounds); // この要素をレンダリングします e.Handled = true; } }; // LayoutRoot 要素を C1PdfDocument にレンダリングします var rc = pdf.PageRectangle; rc.Inflate(-20, -20); pdf.DrawElement(LayoutRoot, rc, ContentAlignment.TopLeft, Stretch.None);