Практическое руководство. Проверка нажатия с использованием геометрического объекта в качестве параметра
В этом примере демонстрируется выполнение проверки нажатия визуального объекта с использованием объекта Geometry в качестве параметра проверки нажатия.
Пример
В следующем примере показано, как настроить проверку нажатия, используя параметры GeometryHitTestParameters для метода HitTest. Значение Point, которое было передано методу OnMouseDown, используется для создания объекта Geometry, чтобы расширить диапазон проверки нажатия.
' Respond to the mouse button down event by setting up a hit test results callback.
Private Overloads Sub OnMouseDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
' Retrieve the coordinate of the mouse position.
Dim pt As Point = e.GetPosition(CType(sender, UIElement))
' Expand the hit test area by creating a geometry centered on the hit test point.
Dim expandedHitTestArea As 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, Nothing, New HitTestResultCallback(AddressOf MyHitTestResultCallback), New GeometryHitTestParameters(expandedHitTestArea))
' Perform actions on the hit test results list.
If hitResultsList.Count > 0 Then
ProcessHitTestResultsList()
End If
End Sub
// 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();
}
}
Свойство IntersectionDetail атрибута GeometryHitTestResult предоставляет сведения о результатах проверки нажатия, в которой в качестве параметра используется объект Geometry. На следующем рисунке показано отношение между геометрическим объектом проверки нажатия (синий круг) и отображенным содержимым конечного визуального объекта (красный квадрат).
Пересечение между геометрическим объектом проверки нажатия и конечным визуальным объектом
В следующем примере показано, как реализовать обратный вызов проверки нажатия, если в качестве параметра проверки нажатия используется объект Geometry. Тип параметра result приводится к типу GeometryHitTestResult, чтобы извлечь значение свойства IntersectionDetail. Это значение позволяет определить, полностью или частично параметр проверки нажатия Geometry находится в отображаемом содержимом целевого объекта проверки нажатия. В этом случае код примера только добавляет результаты проверки нажатия в список визуальных объектов, которые полностью содержатся в пределах границы целевого объекта.
' Return the result of the hit test to the callback.
Public Function MyHitTestResultCallback(ByVal result As HitTestResult) As HitTestResultBehavior
' Retrieve the results of the hit test.
Dim intersectionDetail As IntersectionDetail = (CType(result, GeometryHitTestResult)).IntersectionDetail
Select Case 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
Case Else
Return HitTestResultBehavior.Stop
End Select
End Function
// 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;
}
}
![]() |
---|
Обратный вызов HitTestResult не должен осуществляться, если для деталей пересечения возвращается значение Empty. |
См. также
Задачи
Практическое руководство. Проверка попадания курсора Geometry визуальном объекте