Практическое руководство. Проверка попадания геометрического объекта в визуальный объект
В этом примере показано, как выполнить проверку попадания для визуального объекта, который состоит из одного или нескольких Geometry объектов.
Пример
В следующем примере показано, как получить DrawingGroup из визуальный объект, который использует GetDrawing метод. Затем выполняется попадания на отображаемом содержимом каждого рисунка в DrawingGroup для определения, какой геометрический объект произошло попадание.
Note
В большинстве случаев можно использовать HitTest метод для определения попадания курсора на любой из отображаемого содержимого визуального элемента.
// 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 , используемый в целях спрямления кривой Безье.
Note
В этом примере не учитываются преобразования или обрезка, которые могут быть применены к геометрическому объекту. Кроме того этот пример не будет работать с элементом управления со стилями, поскольку он не имеет никаких рисунков, непосредственно связанных с ним.