このトピックでは、WPFのビジュアル・レイヤーで、DrawingVisualオブジェクトを、どのように、使用するかについての概要を提供します。
DrawingVisualオブジェクト
DrawingVisual Object
DrawingVisualは、図形、画像、テキストをレンダリングするために使用する軽量の描画クラスです。このクラスは、レイアウトやイベント処理を提供しないため、パフォーマンスが向上し、軽量と見なされます。この理由から、描画は、背景やクリップ・アートに最適です。
DrawingVisualホスト・コンテナ
DrawingVisual Host Container
DrawingVisualオブジェクトを使用するため、あなたは、オブジェクトのためのホスト・コンテナを作成する必要があります。ホスト・コンテナ・オブジェクトは、DrawingVisualクラスに欠けている、レイアウトとイベント処理サポートを提供するFrameworkElementクラスから派生する必要があります。その主な目的は、子オブジェクトを含めることであるため、ホスト・コンテナ・オブジェクトは、visibleのプロパティを表示しません。しかしながら、ホスト・コンテナのVisibilityプロパティは、Visibleに設定されている必要があります。;それ以外の場合には、その子要素は、いずれも表示されません。
あなたが、ビジュアル・オブジェクトのためのホスト・コンテナ・オブジェクトを作成するとき、あなたは、ビジュアル・オブジェクト参照を、VisualCollectionに格納する必要があります。ホスト・コンテナに、ビジュアル・オブジェクトを追加するために、Addメソッドを使用します。以下の例では、ホスト・コンテナ・オブジェクトが、作成され、3つのビジュアル・オブジェクトが、そのVisualCollectionに追加されます。
// Create a host visual derived from the FrameworkElement class.
// FrameworkElementクラスから派生したホスト・ビジュアルを作成します。
// This class provides layout, event handling, and container support for
// the child visual objects.
// このクラスは、子のビジュアル・オブジェクトの
// レイアウト、イベント処理、コンテナ・サポートを提供します。
public class MyVisualHost : FrameworkElement
{
// Create a collection of child visual objects.
// 子のビジュアル・オブジェクトのコレクションを作成します。
private VisualCollection _children;
public MyVisualHost()
{
_children = new VisualCollection(this);
_children.Add(CreateDrawingVisualRectangle());
_children.Add(CreateDrawingVisualText());
_children.Add(CreateDrawingVisualEllipses());
// Add the event handler for MouseLeftButtonUp.
// MouseLeftButtonUpのためのイベント・ハンドラを追加します。
this.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(MyVisualHost_MouseLeftButtonUp);
}
上記のコード例が、抽出された完全なコード・サンプルについては、「DrawingVisualsサンプルを使用したヒットテスト」を参照してください。
DrawingVisualオブジェクトを作成する
Creating DrawingVisual Objects
あなたが、DrawingVisualオブジェクトを作成するとき、それには、描画コンテンツがありません。あなたは、オブジェクトのDrawingContextと描画を取り出すことで、テキスト、グラフィクス、画像コンテンツを追加できます。DrawingVisualオブジェクトのRenderOpenメソッドを呼び出すことによって、DrawingContextが、返されます。
DrawingContextに、長方形を描画するために、DrawingContextオブジェクトのDrawRectangleメソッドを使用します。他の型のコンテンツを描画するためのよく似た方法が存在します。あなたが、DrawingContextへのコンテンツの描画が終了したとき、DrawingContextを閉じるために、Closeメソッドを呼び出し、コンテンツを永続化します。
以下の例では、DrawingVisualオブジェクトが、作成され、長方形は、そのDrawingContextに描画されます。
// Create a DrawingVisual that contains a rectangle.
// 長方形が含まれているDrawingVisualを作成します。
private DrawingVisual CreateDrawingVisualRectangle()
{
DrawingVisual drawingVisual = new DrawingVisual();
// Retrieve the DrawingContext in order to create new drawing content.
// 新しい描画コンテンツを作成するために、DrawingContextを取り出します。
DrawingContext drawingContext = drawingVisual.RenderOpen();
// Create a rectangle and draw it in the DrawingContext.
// 長方形を作成し、DrawingContextで描きます。
Rect rect = new Rect(new System.Windows.Point(160, 100), new System.Windows.Size(320, 80));
drawingContext.DrawRectangle(System.Windows.Media.Brushes.LightBlue, (System.Windows.Media.Pen)null, rect);
// Persist the drawing content.
描画コンテンツを永続化します。
drawingContext.Close();
return drawingVisual;
}
FrameworkElementメンバーのオーバーライドを作成する
Creating Overrides for FrameworkElement Members
ホスト・コンテナ・オブジェクトは、ビジュアル・オブジェクトのそのコレクションを管理するために、役割を果たします。これには、派生したFrameworkElementクラスのメンバーをオーバーライドして、ホスト・コンテナが実装する必要があります。
次のリストは、あなたが、オーバーライドする必要がある2つのメンバーについて説明しています。:
- GetVisualChild:
子要素のコレクションから、指定されたインデックスで子供を返します。
- VisualChildrenCount:
この要素内にある、ビジュアルの子要素の数を取得します。
以下の例では、2つのFrameworkElementメンバーのためのオーバーライドが、実装されます。
// Provide a required override for the VisualChildrenCount property.
// VisualChildrenCountプロパティに必要なオーバーライドを提供します。
protected override int VisualChildrenCount
{
get { return _children.Count; }
}
// Provide a required override for the GetVisualChild method.
// GetVisualChildメソッドに必要なオーバーライドを提供します。
protected override Visual GetVisualChild(int index)
{
if (index < 0 || index >= _children.Count)
{
throw new ArgumentOutOfRangeException();
}
return _children[index];
}
ヒット・テストのサポートを提供する
Providing Hit Testing Support
visibleプロパティが、表示されていない場合でも、ホスト・コンテナ・オブジェクトは、イベント処理を提供することができます。-しかしながら、そのVisibilityプロパティは、Visibleに設定されている必要があります。これは、あなたが、左のマウス・ボタンを離すような、マウス・イベントをトラップできる、ホスト・コンテナのためのイベント処理ルーチンを作成できます。イベント処理ルーチンは、続いて、HitTestメソッドを呼び出すことで、ヒット・テストを実装できます。メソッドのHitTestResultCallbackパラメータは、あなたが、ヒット・テストの動作の結果を判断するために使用することができる、ユーザー定義された手順を参照します。
以下の例では、ヒット・テストのサポートは、ホスト・コンテナ・オブジェクトとその子供たちのために実装されています。
// Capture the mouse event and hit test the coordinate point value against
// the child visual objects.
// マウス・イベントをキャプチャし、子のビジュアル・オブジェクトに対して、
// 座標点の値をヒット・テストします。
void MyVisualHost_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
// Retrieve the coordinates of the mouse button event.
// マウスのボタン・イベントの座標を取り出します。
System.Windows.Point pt = e.GetPosition((UIElement)sender);
// Initiate the hit test by setting up a hit test result callback method.
// ヒット・テスト結果のコールバック・メソッドを設定することによって、ヒットテストを開始します。
VisualTreeHelper.HitTest(this, null, new HitTestResultCallback(myCallback), new PointHitTestParameters(pt));
}
// If a child visual object is hit, toggle its opacity to visually indicate a hit.
// 子のビジュアル・オブジェクトが、ヒットしている場合、不透明度を切り替えて、ヒットを視覚的に示します。
public HitTestResultBehavior myCallback(HitTestResult result)
{
if (result.VisualHit.GetType() == typeof(DrawingVisual))
{
if (((DrawingVisual)result.VisualHit).Opacity == 1.0)
{
((DrawingVisual)result.VisualHit).Opacity = 0.4;
}
else
{
((DrawingVisual)result.VisualHit).Opacity = 1.0;
}
}
// Stop the hit test enumeration of objects in the visual tree.
// ビジュアル・ツリー内のオブジェクトのヒット・テストの列挙を停止します。
return HitTestResultBehavior.Stop;
}