新規作成日 2020-10-09
最終更新日
How to: Hit Test Geometry in a Visual
この例は、1つ以上のGeometryオブジェクトで構成されるビジュアル・オブジェクト上で、ヒット・テストが、どのように、動作するかを示します。
例
Example
次の例は、GetDrawingメソッドを使用するビジュアル・オブジェクトからDrawingGroupを、どのように、取り出すかを示します。ヒット・テストは、続いて、どのジオメトリが、ヒットしたか判断するために、DrawingGroup内のそれぞれの描画のレンダリングされたコンテンツ上で、実行されます。
注意
ほとんどの場合、HitTestメソッドを使用して、ポイントが、ビジュアルのレンダリングされたコンテンツのいずれかと交差するかどうかを判断します。
C#
// Determine if a geometry within the visual was hit.
// ビジュアル内のジオメトリが、ヒットしたかどうかを確認します。
static public void HitTestGeometryInVisual(Visual visual, Point pt)
{
// Retrieve the group of drawings for the visual.
// ビジュアルのための描画のグループを取り出します。
DrawingGroup drawingGroup = VisualTreeHelper.GetDrawing(visual);
EnumDrawingGroup(drawingGroup, pt);
}
// Enumerate the drawings in the DrawingGroup.
// DrawingGroupの描画を列挙します。
static public void EnumDrawingGroup(DrawingGroup drawingGroup, Point pt)
{
DrawingCollection drawingCollection = drawingGroup.Children;
// Enumerate the drawings in the DrawingCollection.
// DrawingCollectionの描画を列挙します。
foreach (Drawing drawing in drawingCollection)
{
// If the drawing is a DrawingGroup, call the function recursively.
// 描画が、DrawingGroupの場合、関数を再帰的に呼び出します。
if (drawing.GetType() == typeof(DrawingGroup))
{
EnumDrawingGroup((DrawingGroup)drawing, pt);
}
else if (drawing.GetType() == typeof(GeometryDrawing))
{
// Determine whether the hit test point falls within the geometry.
// ヒット・テストの点が、ジオメトリ内にあるかどうかを判断します。
if (((GeometryDrawing)drawing).Geometry.FillContains(pt))
{
// Perform action based on hit test on geometry.
// ジオメトリー上で、ヒット・テストに基づいて、動作を実行します。
}
}
}
}
FillContainsメソッドは、あなたが、指定されたPointやGeometryを使用して、ヒット・テストできる、オーバーロードされたメソッドです。ジオメトリが、描かれている場合、ストロークは、塗りつぶしの範囲外に伸びることがあります。その場合、あなたは、FillContainsに加えて、StrokeContainsを呼び出すこともできます。
あなたは、Bezier平坦化の目的で使用するToleranceTypeを提供することもできます。
注意
このサンプルでは、ジオメトリーに適用されるかもしれない、変形や切り抜きは、考慮されていません。加えて、このサンプルは、直接、関連付けられた描画がないため、スタイル付きコントロールでは機能しません。