如何:将几何图形用作参数的命中测试

更新:2007 年 11 月

本主题中的示例演示在将 Geometry 用作命中测试参数的情况下,如何针对可视对象执行命中测试。

示例

下面的示例演示如何使用 HitTest 方法的 GeometryHitTestParameters 来设置命中测试。传递给 OnMouseDown 方法的 Point 值用于创建一个 Geometry 对象以扩展命中测试的范围。

// Respond to the mouse button down event by setting up a hit test results callback.
private void OnMouseDown(object sender, MouseButtonEventArgs e)
{
    // Retrieve the coordinate of the mouse position.
    Point pt = e.GetPosition((UIElement)sender);

    // Expand the hit test area by creating a geometry centered on the hit test point.
    EllipseGeometry expandedHitTestArea = new EllipseGeometry(pt, 10.0, 10.0);

    // Clear the contents of the list used for hit test results.
    hitResultsList.Clear();

    // Set up a callback to receive the hit test result enumeration.
    VisualTreeHelper.HitTest(myControl, null,
        new HitTestResultCallback(MyHitTestResultCallback),
        new GeometryHitTestParameters(expandedHitTestArea));

    // Perform actions on the hit test results list.
    if (hitResultsList.Count > 0)
    {
        ProcessHitTestResultsList();
    }
}

GeometryHitTestResultIntersectionDetail 属性提供有关命中测试结果的信息,而 Geometry 用作命中测试的参数。下面的插图演示了命中测试几何图形(蓝色圆圈)与目标可视对象(红色正方形)的呈现内容之间的关系。

命中测试几何图形与目标可视对象之间的交集

命中测试中使用的 IntersectionDetail 的示意图

下面的示例演示在将 Geometry 用作命中测试参数时,如何实现命中测试回调。result 参数将强制转换为 GeometryHitTestResult,以便检索 IntersectionDetail 属性的值。使用属性值,可以确定 Geometry 命中测试参数是完全还是部分包含在命中测试目标的呈现内容中。本例中的示例代码仅将命中测试结果添加到完全包含在目标边界中的可视对象的列表中。

// Return the result of the hit test to the callback.
public HitTestResultBehavior MyHitTestResultCallback(HitTestResult result)
{
    // Retrieve the results of the hit test.
    IntersectionDetail intersectionDetail = ((GeometryHitTestResult)result).IntersectionDetail;

    switch (intersectionDetail)
    {
        case IntersectionDetail.FullyContains:

            // Add the hit test result to the list that will be processed after the enumeration.
            hitResultsList.Add(result.VisualHit);

            return HitTestResultBehavior.Continue;

        case IntersectionDetail.Intersects:

            // Set the behavior to return visuals at all z-order levels.
            return HitTestResultBehavior.Continue;

        case IntersectionDetail.FullyInside:

            // Set the behavior to return visuals at all z-order levels.
            return HitTestResultBehavior.Continue;

        default:
            return HitTestResultBehavior.Stop;
    }
}
说明:

当交集详细信息为 Empty 时,不应当调用 HitTestResult 回调。

请参见

任务

如何:对 Visual 中的几何图形进行命中测试

概念

可视化层中的命中测试