Gewusst wie: Treffertest mit Geometrie als Parameter
Dieses Beispiel zeigt, wie Sie einen Treffertest für ein visuelles Objekt durchführen, indem Sie Geometry als Parameter verwenden.
Beispiel
Im folgenden Beispiel wird veranschaulicht, wie mit GeometryHitTestParameters für die HitTest-Methode ein Treffertest eingerichtet wird. Der an die OnMouseDown-Methode übergebene Point-Wert wird zum Erstellen eines Geometry-Objekts verwendet, um den Bereich des Treffertests zu erweitern.
' 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();
}
}
Die IntersectionDetail-Eigenschaft von GeometryHitTestResult stellt Informationen über die Ergebnisse eines Treffertests bereit, in dem eine Geometry als Treffertestparameter verwendet wird. In der folgenden Abbildung wird die Beziehung zwischen der Treffertestgeometrie (der blaue Kreis) und dem gerenderten Inhalt des Zielobjekts (das rote Quadrat) dargestellt.
Schnittmenge einer Treffertestgeometrie und eines Zielobjekts
Das folgende Beispiel zeigt, wie Sie einen Treffertestrückruf implementieren, wenn Geometry als Treffertestparameter verwendet wird. Der result-Parameter wird in ein GeometryHitTestResult umgewandelt, um den Wert der IntersectionDetail-Eigenschaft abzurufen. Mit diesem Eigenschaftswert können Sie feststellen, ob der Geometry-Treffertestparameter ganz oder teilweise im gerenderten Inhalt des Treffertestziels enthalten ist. In diesem Fall fügt der Beispielcode der Liste visueller Objekte nur Treffertestergebnisse hinzu, die vollständig im Zielbereich enthalten sind.
' 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;
}
}
Hinweis |
---|
Rufen Sie den HitTestResult-Rückruf nicht auf, wenn die Schnittmenge den Wert Empty aufweist. |
Siehe auch
Aufgaben
Gewusst wie: Treffertest für eine Geometrie in einem visuellen Objekt