Treffertests in der visuellen EbeneHit Testing in the Visual Layer

Dieses Thema enthält eine Übersicht über die Treffertestfunktionen der visuellen Ebene.This topic provides an overview of hit testing functionality provided by the visual layer. Mit der Unterstützung für Treffer Tests können Sie feststellen Visual, ob ein Geometrie-oder Punktwert in den gerenderten Inhalt eines fällt, sodass Sie das Verhalten der Benutzeroberfläche implementieren können, z. b. ein Auswahl Rechteck zum Auswählen mehrerer Objekte.Hit testing support allows you to determine whether a geometry or point value falls within the rendered content of a Visual, allowing you to implement user interface behavior such as a selection rectangle to select multiple objects.

TreffertestszenariosHit Testing Scenarios

Die UIElement -Klasse stellt InputHitTest die-Methode bereit, mit der Sie einen Treffer Test für ein Element mit einem angegebenen Koordinaten Wert durchsetzen können.The UIElement class provides the InputHitTest method, which allows you to hit test against an element using a given coordinate value. In vielen Fällen stellt die InputHitTest -Methode die gewünschte Funktionalität zum Implementieren von Treffer Tests von Elementen bereit.In many cases, the InputHitTest method provides the desired functionality for implementing hit testing of elements. Es gibt jedoch mehrere Szenarios, bei denen es möglicherweise erforderlich ist, den Treffertest auf der visuellen Ebene zu implementieren.However, there are several scenarios in which you may need to implement hit testing at the visual layer.

  • Treffer Tests für nicht-UIElement -Objekte: Dies gilt, wenn beim Testen von nicht-UIElement -Objekten, DrawingVisual z. b. oder Grafikobjekten, ein Treffer auftritt.Hit testing against non-UIElement objects: This applies if you are hit testing non-UIElement objects, such as DrawingVisual or graphics objects.

  • Treffer Tests mithilfe einer Geometrie: Dies gilt, wenn Sie einen Treffer Test über ein Geometry-Objekt statt über den Koordinaten Wert eines Punkts durchsetzen müssen.Hit testing using a geometry: This applies if you need to hit test using a geometry object rather than the coordinate value of a point.

  • Treffer Tests für mehrere Objekte: Dies trifft zu, wenn Sie einen Treffer Test für mehrere Objekte durchführt, z. b. überlappende Objekte.Hit testing against multiple objects: This applies when you need to hit test against multiple objects, such as overlapping objects. Sie können Ergebnisse für alle grafischen Elemente abrufen, die eine Geometrie oder einen Punkt kreuzen, nicht nur für das erste.You can get results for all visuals intersecting a geometry or point, not just the first one.

  • Richt UIElement Linie für Treffer Tests wird ignoriert: Dies trifft zu, wenn Sie die UIElement Richtlinie für Treffer Tests ignorieren müssen. dabei werden Faktoren berücksichtigt, die davon abhängen, ob ein Element deaktiviert oder unsichtbar ist.Ignoring UIElement hit testing policy: This applies when you need to ignore the UIElement hit testing policy, which takes into consideration such factors as whether an element is disabled or invisible.

Hinweis

Ein vollständiges Codebeispiel für einen Treffertest in der visuellen Ebene finden Sie unter Beispiel für einen Treffertest mit DrawingVisuals und Beispiel für einen Treffertest mit Win32-Interoperabilität.For a complete code sample illustrating hit testing at the visual layer, see Hit Test Using DrawingVisuals Sample and Hit Test with Win32 Interoperation Sample.

Unterstützung für den TreffertestHit Testing Support

Der Zweck HitTest der Methoden in der VisualTreeHelper -Klasse besteht darin, zu bestimmen, ob sich ein Geometrie-oder Punkt Koordinaten Wert innerhalb des gerenderten Inhalts eines bestimmten Objekts befindet, z. b. ein Steuerelement oder ein grafisches Element.The purpose of the HitTest methods in the VisualTreeHelper class is to determine whether a geometry or point coordinate value is within the rendered content of a given object, such as a control or graphic element. Sie können beispielsweise den Treffertest verwenden um zu bestimmen, ob ein Mausklick innerhalb des umgebenden Rechtecks eines Objekts in die Geometrie eines Kreises fällt.For example, you could use hit testing to determine whether a mouse click within the bounding rectangle of an object falls within the geometry of a circle. Sie können auch die Standardimplementierung für den Treffertest überschreiben, um Ihre eigenen benutzerdefinierten Treffertestberechnungen durchzuführen.You can also choose to override the default implementation of hit testing to perform your own custom hit test calculations.

Die folgende Abbildung zeigt die Beziehung zwischen dem Bereich eines nicht rechteckigen Objekts und seinem umschließenden Rechteck.The following illustration shows the relationship between a non-rectangular object's region and its bounding rectangle.

Diagramm des gültigen Treffer TestbereichsDiagram of valid hit test region
Diagramm eines gültigen TreffertestbereichsDiagram of valid hit test region

Treffertest und Z-ReihenfolgeHit Testing and Z-Order

Die visuelle Ebene für Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) unterstützt den Treffertest für alle Objekte unter einem Punkt oder einer Geometrie und nicht nur für das oberste Objekt.The Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) visual layer supports hit testing against all objects under a point or geometry, not just the top-most object. Die Ergebnisse werden in Z-Reihenfolge zurückgegeben.Results are returned in z-order. Das visuelle Objekt, das Sie als Parameter an die HitTest Methode übergeben, bestimmt jedoch, welcher Teil der visuellen Struktur als Treffer Test verwendet wird.However, the visual object that you pass as the parameter to the HitTest method determines which portion of the visual tree that will be hit test. Sie können einen Treffertest für die ganze visuelle Struktur oder einen beliebigen Teil davon durchführen.You can hit test against the entire visual tree, or any portion of it.

In der folgenden Abbildung befindet sich das Kreisobjekt sowohl auf dem Quadrat als auch auf dem Dreieck.In the following illustration, the circle object is on top of both the square and triangle objects. Wenn Sie nur an einem Treffer Test für das visuelle Objekt interessiert sind, dessen z-Reihenfolge Wert am häufigsten ist, können Sie die Enumeration des visuellen Treffer Stop Tests so HitTestResultCallback festlegen, dass Sie von der zurückgegeben wird, um den Treffer Test nach dem ersten Element zu unterbinden.If you are only interested in hit testing the visual object whose z-order value is top-most, you can set the visual hit test enumeration to return Stop from the HitTestResultCallback to stop the hit test traversal after the first item.

![Diagramm der z--Reihenfolge einer visuellen] Struktur (./media/wcpsdk-mmgraphics-visuals-hittest-2.png "wcpsdk_mmgraphics_visuals_hittest_2")Diagram of the z-order of a visual tree
Diagramm der Z-Reihenfolge einer visuellen StrukturDiagram of the z-order of a visual tree

Wenn Sie alle visuellen Objekte unter einem bestimmten Punkt oder einer Geometrie auflisten möchten, geben Sie Continue HitTestResultCallbackvon zurück.If you want to enumerate all visual objects under a specific point or geometry, return Continue from the HitTestResultCallback. Dies bedeutet, dass Sie den Treffertest sogar für vollständig von anderen Objekten überdeckte visuelle Objekte durchführen können.This means you can hit test for visual objects that are beneath other objects, even if they are wholly obscured. Weitere Informationen finden Sie im Beispielcode im Abschnitt „Verwenden eines Treffertest-Ergebnisrückrufs“.See the sample code in the section "Using a Hit Test Results Callback" for more information.

Hinweis

Auch für transparente visuelle Objekte kann der Treffertest durchgeführt werden.A visual object that is transparent can also be hit test.

Verwenden des StandardtreffertestsUsing Default Hit Testing

Sie können ermitteln, ob sich ein Punkt innerhalb der Geometrie eines visuellen Objekts befindet, indem Sie HitTest die-Methode verwenden, um ein visuelles Objekt und einen Punkt Koordinaten Wert für den Test anzugeben.You can identify whether a point is within the geometry of a visual object, by using the HitTest method to specify a visual object and a point coordinate value to test against. Der visuelle Objektparameter identifiziert den Ausgangspunkt in der visuellen Struktur für die Treffertestsuche.The visual object parameter identifies the starting point in the visual tree for the hit test search. Wenn ein visuelles Objekt in der visuellen Struktur gefunden wird, deren Geometrie die-Koordinate enthält, wird es VisualHit auf die- HitTestResult Eigenschaft eines-Objekts festgelegt.If a visual object is found in the visual tree whose geometry contains the coordinate, it is set to the VisualHit property of a HitTestResult object. Der HitTestResult wird dann von der HitTest -Methode zurückgegeben.The HitTestResult is then returned from the HitTest method. Wenn der Punkt nicht in der visuellen Teilstruktur enthalten ist, für die Sie einen Treffer HitTest Test nulldurchlaufen, wird zurückgegeben.If the point is not contained with the visual sub-tree you are hit testing, HitTest returns null.

Hinweis

Der Standardtreffertest gibt immer das oberste Objekt in der Z-Reihenfolge zurück.Default hit testing always returns the top-most object in the z-order. Wenn Sie alle visuellen Objekte identifizieren möchten – auch diejenigen, die teilweise oder vollständig verdeckt sind –, verwenden Sie einen Treffertest-Ergebnisrückruf.In order to identify all visual objects, even those that may be partly or wholly obscured, use a hit test result callback.

Der Koordinaten Wert, den Sie als Punkt Parameter für die HitTest Methode übergeben, muss relativ zum Koordinaten Bereich des visuellen Objekts sein, für das Sie den Treffer Test durchlaufen.The coordinate value you pass as the point parameter for the HitTest method has to be relative to the coordinate space of the visual object you are hit testing against. Wenn Sie beispielsweise visuelle Objekte geschachtelt haben, die im übergeordneten Koordinatenraum bei (100, 100) definiert sind, entspricht der Treffertest eines untergeordneten visuellen Objekts bei (0, 0) dem Treffertest bei (100, 100) im übergeordneten Koordinatenraum.For example, if you have nested visual objects defined at (100, 100) in the parent's coordinate space, then hit testing a child visual at (0, 0) is equivalent to hit testing at (100, 100) in the parent's coordinate space.

Der folgende Code zeigt, wie Sie Maus Ereignishandler für ein UIElement -Objekt einrichten, das verwendet wird, um Ereignisse zu erfassen, die für Treffer Tests verwendet werden.The following code shows how to set up mouse event handlers for a UIElement object that is used to capture events used for hit testing.

// Respond to the left mouse button down event by initiating the hit test.
private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    // Retrieve the coordinate of the mouse position.
    Point pt = e.GetPosition((UIElement)sender);

    // Perform the hit test against a given portion of the visual object tree.
    HitTestResult result = VisualTreeHelper.HitTest(myCanvas, pt);

    if (result != null)
    {
        // Perform action on hit visual object.
    }
}
' Respond to the left mouse button down event by initiating the hit test.
Private Overloads Sub OnMouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
    ' Retrieve the coordinate of the mouse position.
    Dim pt As Point = e.GetPosition(CType(sender, UIElement))

    ' Perform the hit test against a given portion of the visual object tree.
    Dim result As HitTestResult = VisualTreeHelper.HitTest(myCanvas, pt)

    If result IsNot Nothing Then
        ' Perform action on hit visual object.
    End If
End Sub

Beeinflussung des Treffertests durch die visuelle StrukturHow the Visual Tree Affects Hit Testing

Der Startpunkt in der visuellen Struktur bestimmt, welche Objekte während der Treffertestenumeration der Objekte zurückgegeben werden.The starting point in the visual tree determines which objects are returned during the hit test enumeration of objects. Wenn Sie für mehrere Objekte einen Treffertest durchführen möchten, muss das in der visuellen Struktur als Startpunkt verwendete Objekt das gemeinsame übergeordnete Element aller betroffenen Objekte sein.If you have multiple objects you want to hit test, the visual object used as the starting point in the visual tree must be the common ancestor of all objects of interest. Wenn Sie beispielsweise sowohl für das Schaltflächenelement als auch für das visuelle Zeichnungsobjekt im folgenden Diagramm einen Treffertest durchführen möchten, müssen Sie den Startpunkt in der visuellen Struktur auf das gemeinsame übergeordnete Objekt für diese beiden Elemente festlegen.For example, if you were interested in hit testing both the button element and drawing visual in the following diagram, you would have to set the starting point in the visual tree to the common ancestor of both. In diesem Fall ist das Canvas-Element das übergeordnete Objekt für das Schaltflächenelement und das visuelle Zeichnungsobjekt.In this case, the canvas element is the common ancestor of both the button element and the drawing visual.

Diagramm einer visuellen Struktur HierarchieDiagram of a visual tree hierarchy
Diagramm einer visuellen StrukturhierarchieDiagram of a visual tree hierarchy

Hinweis

Die IsHitTestVisible -Eigenschaft ruft einen Wert ab oder legt einen Wert UIElementfest, der deklariert, ob ein von abgeleitetes Objekt als Treffer Testergebnis von einem Teil des gerenderten Inhalts zurückgegeben werden kann.The IsHitTestVisible property gets or sets a value that declares whether a UIElement-derived object can possibly be returned as a hit test result from some portion of its rendered content. Dadurch haben Sie die Möglichkeit, selektiv Änderungen an der visuellen Struktur vorzunehmen, um zu bestimmen, welche visuellen Objekte an einem Treffertest beteiligt sind.This allows you to selectively alter the visual tree to determine which visual objects are involved in a hit test.

Verwenden eines Treffertest-ErgebnisrückrufsUsing a Hit Test Result Callback

Sie können alle visuellen Objekte in einer visuellen Struktur auflisten, deren Geometrie einen angegebenen Koordinatenwert enthält.You can enumerate all visual objects in a visual tree whose geometry contains a specified coordinate value. Dadurch können Sie alle visuellen Objekte identifizieren, auch diejenigen, die teilweise oder vollständig von anderen visuellen Objekten verdeckt werden.This allows you to identify all visual objects, even those that may be partly or wholly obscured by other visual objects. Um visuelle Objekte in einer visuellen Struktur aufzulisten, verwenden Sie HitTest die-Methode mit einer Treffer Test-Rückruffunktion.To enumerate visual objects in a visual tree use the HitTest method with a hit test callback function. Die Treffertest-Rückruffunktion wird vom System aufgerufen, wenn der von Ihnen angegebene Koordinatenwert in einem visuellen Objekt enthalten ist.The hit test callback function is called by the system when the coordinate value you specify is contained in a visual object.

Während der Auflistung der Treffertestergebnisse sollten Sie keine Vorgänge ausführen, die die visuelle Struktur ändern.During the hit test results enumeration, you should not perform any operation that modifies the visual tree. Das Hinzufügen oder Entfernen eines Objekts aus der visuellen Struktur, während diese durchlaufen wird, kann zu unvorhersehbarem Verhalten führen.Adding or removing an object from the visual tree while it is being traversed can result in unpredictable behavior. Sie können die visuelle Struktur sicher ändern, nachdem HitTest die-Methode zurückgegeben wurde.You can safely modify the visual tree after the HitTest method returns. Möglicherweise möchten Sie eine Datenstruktur bereitstellen, z. ArrayListb. ein, um Werte während der Enumeration der Treffer Testergebnisse zu speichern.You may want to provide a data structure, such as an ArrayList, to store values during the hit test results enumeration.

// Respond to the right mouse button down event by setting up a hit test results callback.
private void OnMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    // Retrieve the coordinate of the mouse position.
    Point pt = e.GetPosition((UIElement)sender);

    // 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(myCanvas, null,
        new HitTestResultCallback(MyHitTestResult),
        new PointHitTestParameters(pt));

    // Perform actions on the hit test results list.
    if (hitResultsList.Count > 0)
    {
        Console.WriteLine("Number of Visuals Hit: " + hitResultsList.Count);
    }
}
' Respond to the right mouse button down event by setting up a hit test results callback.
Private Overloads Sub OnMouseRightButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
    ' Retrieve the coordinate of the mouse position.
    Dim pt As Point = e.GetPosition(CType(sender, UIElement))

    ' 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(myCanvas, Nothing, New HitTestResultCallback(AddressOf MyHitTestResult), New PointHitTestParameters(pt))

    ' Perform actions on the hit test results list.
    If hitResultsList.Count > 0 Then
        Console.WriteLine("Number of Visuals Hit: " & hitResultsList.Count)
    End If
End Sub

Die Treffertest-Rückrufmethode definiert die Aktionen, die ausgeführt werden, wenn ein Treffertest für ein bestimmtes visuelles Objekt in der visuellen Struktur identifiziert wird.The hit test callback method defines the actions you perform when a hit test is identified on a particular visual object in the visual tree. Nachdem Sie die Aktionen ausgeführt haben, geben Sie HitTestResultBehavior einen Wert zurück, der bestimmt, ob die Enumeration anderer visueller Objekte fortgesetzt werden soll.After you perform the actions, you return a HitTestResultBehavior value that determines whether to continue the enumeration of any other visual objects or not.

// Return the result of the hit test to the callback.
public HitTestResultBehavior MyHitTestResult(HitTestResult result)
{
    // Add the hit test result to the list that will be processed after the enumeration.
    hitResultsList.Add(result.VisualHit);

    // Set the behavior to return visuals at all z-order levels.
    return HitTestResultBehavior.Continue;
}
' Return the result of the hit test to the callback.
Public Function MyHitTestResult(ByVal result As HitTestResult) As HitTestResultBehavior
    ' Add the hit test result to the list that will be processed after the enumeration.
    hitResultsList.Add(result.VisualHit)

    ' Set the behavior to return visuals at all z-order levels.
    Return HitTestResultBehavior.Continue
End Function

Hinweis

Die Auflistung der visuellen Objekttreffer erfolgt in Z-Reihenfolge.The order of enumeration of hit visual objects is by z-order. Das visuelle Objekt auf der obersten Z-Reihenfolgenebene ist das erste aufgelistete Objekt.The visual object at the top-most z-order level is the first object enumerated. Alle anderen visuellen Objekte werden absteigend gemäß der Z-Reihenfolge aufgelistet.Any other visual objects enumerated are at decreasing z-order level. Diese Auflistungsreihenfolge entspricht der Renderingreihenfolge der grafischen Elemente.This order of enumeration corresponds to the rendering order of the visuals.

Sie können die Enumeration von visuellen Objekten jederzeit in der Treffer Test-Rückruffunktion durch zurück Stopgeben von beendet werden.You can stop the enumeration of visual objects at any time in the hit test callback function by returning Stop.

// Set the behavior to stop enumerating visuals.
return HitTestResultBehavior.Stop;
' Set the behavior to stop enumerating visuals.
Return HitTestResultBehavior.Stop

Verwenden eines Treffertestfilter-RückrufsUsing a Hit Test Filter Callback

Sie können einen optionalen Treffertestfilter verwenden, um die an die Treffertestergebnisse übergebenen Objekte zu begrenzen.You can use an optional hit test filter to restrict the objects that are passed on to the hit test results. Dadurch können Sie die Teile der visuellen Struktur ignorieren, die nicht in Ihren Treffertestergebnissen verarbeitet werden sollen.This allows you to ignore parts of the visual tree that you are not interested in processing in your hit test results. Zum Implementieren eines Treffer Test Filters definieren Sie eine Treffer Test Filter-Rückruffunktion und übergeben Sie als Parameterwert, wenn Sie die HitTest -Methode aufrufen.To implement a hit test filter, you define a hit test filter callback function and pass it as a parameter value when you call the HitTest method.

// Respond to the mouse wheel event by setting up a hit test filter and results enumeration.
private void OnMouseWheel(object sender, MouseWheelEventArgs e)
{
    // Retrieve the coordinate of the mouse position.
    Point pt = e.GetPosition((UIElement)sender);

    // 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(myCanvas,
                      new HitTestFilterCallback(MyHitTestFilter),
                      new HitTestResultCallback(MyHitTestResult),
                      new PointHitTestParameters(pt));

    // Perform actions on the hit test results list.
    if (hitResultsList.Count > 0)
    {
        ProcessHitTestResultsList();
    }
}
' Respond to the mouse wheel event by setting up a hit test filter and results enumeration.
Private Overloads Sub OnMouseWheel(ByVal sender As Object, ByVal e As MouseWheelEventArgs)
    ' Retrieve the coordinate of the mouse position.
    Dim pt As Point = e.GetPosition(CType(sender, UIElement))

    ' 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(myCanvas, New HitTestFilterCallback(AddressOf MyHitTestFilter), New HitTestResultCallback(AddressOf MyHitTestResult), New PointHitTestParameters(pt))

    ' Perform actions on the hit test results list.
    If hitResultsList.Count > 0 Then
        ProcessHitTestResultsList()
    End If
End Sub

Wenn Sie die optionale Treffer Test Filter-Rückruffunktion nicht angeben möchten, übergeben Sie einen null -Wert als Parameter für die HitTest -Methode.If you do not want to supply the optional hit test filter callback function, pass a null value as its parameter for the HitTest method.

// Set up a callback to receive the hit test result enumeration,
// but no hit test filter enumeration.
VisualTreeHelper.HitTest(myCanvas,
                  null,  // No hit test filtering.
                  new HitTestResultCallback(MyHitTestResult),
                  new PointHitTestParameters(pt));
' Set up a callback to receive the hit test result enumeration,
' but no hit test filter enumeration.
VisualTreeHelper.HitTest(myCanvas, Nothing, New HitTestResultCallback(AddressOf MyHitTestResult), New PointHitTestParameters(pt)) ' No hit test filtering.

Löschen eines visuellen Baums mithilfe eines Treffer Test FiltersPruning a visual tree using a hit test filter
Reduzieren der Verzweigungen in einer visuellen StrukturPruning a visual tree

Mit der Treffertestfilter-Rückruffunktion können Sie alle visuellen Objekte auflisten, deren gerenderte Inhalte die von Ihnen angegebenen Koordinaten enthalten.The hit test filter callback function allows you to enumerate through all the visuals whose rendered content contains the coordinates you specify. Sie können jedoch auch bestimmte Verzweigungen der visuellen Struktur ignorieren, die im Rahmen Ihrer Treffertestergebnis-Rückruffunktion nicht verarbeitet werden sollen.However, you may want to ignore certain branches of the visual tree that you are not interested in processing in your hit test results callback function. Der Rückgabewert der Treffertestfilter-Rückruffunktion bestimmt, welcher Typ von Aktion von der Enumeration der visuellen Objekte ausgeführt werden soll.The return value of the hit test filter callback function determines what type of action the enumeration of the visual objects should take. Wenn Sie z. b. den Wert ContinueSkipSelfAndChildrenzurückgeben, können Sie das aktuelle visuelle Objekt und seine untergeordneten Elemente aus der Enumeration der Treffer Testergebnisse entfernen.For example, if you return the value, ContinueSkipSelfAndChildren, you can remove the current visual object and its children from the hit test results enumeration. Dies bedeutet, dass für die Treffertestergebnis-Rückruffunktion diese Objekte nicht in der Auflistung enthalten sind.This means that the hit test results callback function will not see these objects in its enumeration. Durch das Reduzieren der Verzweigungen in der visuellen Struktur von Objekten wird der Verarbeitungsaufwand während der Übergabe der Auflistung von Treffertestergebnissen verringert.Pruning the visual tree of objects decreases the amount of processing during the hit test results enumeration pass. Im folgenden Codebeispiel überspringt der Filter Bezeichnungen und ihre Nachfolgerelemente und führt für alle anderen Elemente Treffertests durch.In the following code example, the filter skips labels and their descendants and hit tests everything else.

// Filter the hit test values for each object in the enumeration.
public HitTestFilterBehavior MyHitTestFilter(DependencyObject o)
{
    // Test for the object value you want to filter.
    if (o.GetType() == typeof(Label))
    {
        // Visual object and descendants are NOT part of hit test results enumeration.
        return HitTestFilterBehavior.ContinueSkipSelfAndChildren;
    }
    else
    {
        // Visual object is part of hit test results enumeration.
        return HitTestFilterBehavior.Continue;
    }
}
' Filter the hit test values for each object in the enumeration.
Public Function MyHitTestFilter(ByVal o As DependencyObject) As HitTestFilterBehavior
    ' Test for the object value you want to filter.
    If o.GetType() Is GetType(Label) Then
        ' Visual object and descendants are NOT part of hit test results enumeration.
        Return HitTestFilterBehavior.ContinueSkipSelfAndChildren
    Else
        ' Visual object is part of hit test results enumeration.
        Return HitTestFilterBehavior.Continue
    End If
End Function

Hinweis

Der Treffertestfilter-Rückruf wird gelegentlich aufgerufen, wenn der Treffertestergebnis-Rückruf nicht aufgerufen wird.The hit test filter callback will sometimes be called in cases where the hit test results callback is not called.

Überschreiben des StandardtreffertestsOverriding Default Hit Testing

Sie können die standardmäßige Treffer Testunterstützung eines visuellen Objekts überschreiben, HitTestCore indem Sie die-Methode überschreiben.You can override a visual object’s default hit testing support by overriding the HitTestCore method. Dies bedeutet, dass beim Aufrufen der HitTest -Methode die überschriebene Implementierung HitTestCore von aufgerufen wird.This means that when you invoke the HitTest method, your overridden implementation of HitTestCore is called. Ihre überschriebene Methode wird aufgerufen, wenn sich ein Treffertest innerhalb des umgebenden Rechtecks für das visuelle Objekt befindet. Dies gilt auch dann, wenn die Koordinate außerhalb des gerenderten Inhalts des visuellen Objekts liegt.Your overridden method is called when a hit test falls within the bounding rectangle of the visual object, even if the coordinate falls outside the rendered content of the visual object.

// Override default hit test support in visual object.
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
    Point pt = hitTestParameters.HitPoint;

    // Perform custom actions during the hit test processing,
    // which may include verifying that the point actually
    // falls within the rendered content of the visual.

    // Return hit on bounding rectangle of visual object.
    return new PointHitTestResult(this, pt);
}
' Override default hit test support in visual object.
Protected Overrides Overloads Function HitTestCore(ByVal hitTestParameters As PointHitTestParameters) As HitTestResult
    Dim pt As Point = hitTestParameters.HitPoint

    ' Perform custom actions during the hit test processing,
    ' which may include verifying that the point actually
    ' falls within the rendered content of the visual.

    ' Return hit on bounding rectangle of visual object.
    Return New PointHitTestResult(Me, pt)
End Function

Es kann vorkommen, dass Sie einen Treffertest sowohl für das umschließende Rechteck als auch für den gerenderten Inhalt eines visuellen Objekts durchführen möchten.There may be times when you want to hit test against both the bounding rectangle and the rendered content of a visual object. Wenn Sie den PointHitTestParameters Parameterwert in der überschriebenen HitTestCore Methode als Parameter für die Basis Methode HitTestCoreverwenden, können Sie Aktionen auf Grundlage eines Treffer des umgebenden Rechtecks eines visuellen Objekts ausführen und dann einen zweiten Treffer Test für das gerenderter Inhalt des visuellen Objekts.By using the PointHitTestParameters parameter value in your overridden HitTestCore method as the parameter to the base method HitTestCore, you can perform actions based on a hit of the bounding rectangle of a visual object, and then perform a second hit test against the rendered content of the visual object.

// Override default hit test support in visual object.
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
    // Perform actions based on hit test of bounding rectangle.
    // ...

    // Return results of base class hit testing,
    // which only returns hit on the geometry of visual objects.
    return base.HitTestCore(hitTestParameters);
}
' Override default hit test support in visual object.
Protected Overrides Overloads Function HitTestCore(ByVal hitTestParameters As PointHitTestParameters) As HitTestResult
    ' Perform actions based on hit test of bounding rectangle.
    ' ...

    ' Return results of base class hit testing,
    ' which only returns hit on the geometry of visual objects.
    Return MyBase.HitTestCore(hitTestParameters)
End Function

Siehe auchSee also