Handleiding: Hit Testen met Geometrie als Parameter
In dit voorbeeld ziet u hoe u een hittest uitvoert op een visueel object met behulp van een Geometry als een parameter voor een hittest.
Voorbeeld
In het volgende voorbeeld ziet u hoe u een hittest instelt met behulp van GeometryHitTestParameters voor de methode HitTest. De Point-waarde die naar de OnMouseDown
-methode wordt doorgegeven, wordt gebruikt om een Geometry-object te maken om het bereik van de hittest te vergroten.
// 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();
}
}
' 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
De eigenschap IntersectionDetail van GeometryHitTestResult bevat informatie over de resultaten van een hit-test die gebruikmaakt van een Geometry als hittestparameter. In de volgende afbeelding ziet u de relatie tussen de hittest-geometrie (de blauwe cirkel) en de gerenderde inhoud van het doelvisualisatie-object (het rode vierkant).
In het volgende voorbeeld ziet u hoe u een callback voor een hittest implementeert wanneer een Geometry wordt gebruikt als een hittestparameter. De parameter result
wordt naar een GeometryHitTestResult gecast om de waarde van de eigenschap IntersectionDetail op te halen. Met de eigenschapswaarde kunt u bepalen of de parameter Geometry hittest volledig of gedeeltelijk is opgenomen in de weergegeven inhoud van het doel van de hittest. In dit geval voegt de voorbeeldcode alleen hittestresultaten toe aan de lijst voor visuals die volledig binnen de doelgrens vallen.
// 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;
}
}
' 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
Notitie
De HitTestResult callback mag niet worden aangeroepen wanneer het snijpuntdetail Emptyis.
Zie ook
.NET Desktop feedback