Поделиться через


Практическое руководство. Проверка попадания курсора Geometry визуальном объекте

В данном примере показано, как выполнять проверку попадания курсора на визуальный объект, состоящий из одного или нескольких объектов Geometry.

Пример

В следующем примере показано, как извлечь объект DrawingGroup из визуального объекта, который использует метод GetDrawing. Затем выполняется проверка попадания курсора на отображенное содержимое каждого рисунка объекта DrawingGroup, чтобы определить, на какой геометрический объект попал курсор.

ПримечаниеПримечание

Для определения попадания курсора на какую-либо часть отображенного содержимого визуального объекта, в большинстве случаев следует использовать метод HitTest.

        ' Determine if a geometry within the visual was hit.
        Public Shared Sub HitTestGeometryInVisual(ByVal visual As Visual, ByVal pt As Point)
            ' Retrieve the group of drawings for the visual.
            Dim drawingGroup As DrawingGroup = VisualTreeHelper.GetDrawing(visual)
            EnumDrawingGroup(drawingGroup, pt)
        End Sub

        ' Enumerate the drawings in the DrawingGroup.
        Public Shared Sub EnumDrawingGroup(ByVal drawingGroup As DrawingGroup, ByVal pt As Point)
            Dim drawingCollection As DrawingCollection = drawingGroup.Children

            ' Enumerate the drawings in the DrawingCollection.
            For Each drawing As Drawing In drawingCollection
                ' If the drawing is a DrawingGroup, call the function recursively.
                If drawing.GetType() Is GetType(DrawingGroup) Then
                    EnumDrawingGroup(CType(drawing, DrawingGroup), pt)
                ElseIf drawing.GetType() Is GetType(GeometryDrawing) Then
                    ' Determine whether the hit test point falls within the geometry.
                    If (CType(drawing, GeometryDrawing)).Geometry.FillContains(pt) Then
                        ' Perform action based on hit test on geometry.
                    End If
                End If

            Next drawing
        End Sub
// 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.
static public void EnumDrawingGroup(DrawingGroup drawingGroup, Point pt)
{
    DrawingCollection drawingCollection = drawingGroup.Children;

    // Enumerate the drawings in the DrawingCollection.
    foreach (Drawing drawing in drawingCollection)
    {
        // If the drawing is a DrawingGroup, call the function recursively.
        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. Если есть пересечение с геометрической фигурой, то оно может лежать за пределами границ заполнения. В этом случае, возможно, потребуется вызов StrokeContains в дополнение к FillContains.

Можно также предоставить ToleranceType, который используется в целях спрямления кривой Безье.

ПримечаниеПримечание

В данном примере не принимаются в расчет никакие преобразования или отсечения, которые могут быть применены к геометрической фигуре.Кроме того, данный пример не будет работать с элементом управления со стилями, поскольку он не имеет никаких рисунков, непосредственно связанных с ним.

См. также

Задачи

Практическое руководство. Проверка нажатия с использованием геометрического объекта в качестве параметра

Основные понятия

Проверка попадания на визуальном уровне