VisualTreeHelper.FindElementsInHostCoordinates Método

Definición

Sobrecargas

FindElementsInHostCoordinates(Point, UIElement)

Recupera un conjunto de objetos que se encuentran dentro de un punto de coordenada x-y especificado de una interfaz de usuario de la aplicación. El conjunto de objetos representa los componentes de un árbol visual que comparten ese punto.

FindElementsInHostCoordinates(Rect, UIElement)

Recupera un conjunto de objetos que se encuentran dentro de un marco rect especificado de una interfaz de usuario de la aplicación. El conjunto de objetos representa los componentes de un árbol visual que comparten un área rectangular y podría incluir elementos que se sobredibujan.

FindElementsInHostCoordinates(Point, UIElement, Boolean)

Recupera un conjunto de objetos que se encuentran dentro de un punto de coordenada x-y especificado de una interfaz de usuario de la aplicación. El conjunto de objetos representa los componentes de un árbol visual que comparten ese punto.

FindElementsInHostCoordinates(Rect, UIElement, Boolean)

Recupera un conjunto de objetos que se encuentran dentro de un marco rect especificado de una interfaz de usuario de la aplicación. El conjunto de objetos representa los componentes de un árbol visual que comparten un área rectangular y podría incluir elementos que se sobredibujan.

FindElementsInHostCoordinates(Point, UIElement)

Recupera un conjunto de objetos que se encuentran dentro de un punto de coordenada x-y especificado de una interfaz de usuario de la aplicación. El conjunto de objetos representa los componentes de un árbol visual que comparten ese punto.

public:
 static IIterable<UIElement ^> ^ FindElementsInHostCoordinates(Point intersectingPoint, UIElement ^ subtree);
/// [Windows.Foundation.Metadata.DefaultOverload]
/// [Windows.Foundation.Metadata.Overload("FindElementsInHostCoordinatesPoint")]
 static IIterable<UIElement> FindElementsInHostCoordinates(Point const& intersectingPoint, UIElement const& subtree);
[Windows.Foundation.Metadata.DefaultOverload]
[Windows.Foundation.Metadata.Overload("FindElementsInHostCoordinatesPoint")]
public static IEnumerable<UIElement> FindElementsInHostCoordinates(Point intersectingPoint, UIElement subtree);
function findElementsInHostCoordinates(intersectingPoint, subtree)
Public Shared Function FindElementsInHostCoordinates (intersectingPoint As Point, subtree As UIElement) As IEnumerable(Of UIElement)

Parámetros

intersectingPoint
Point

Punto que se va a utilizar como punto de determinación. Este punto usa el espacio de coordenadas de la ventana de la aplicación, no de ningún elemento específico (y no del subárbol si se especifica).

subtree
UIElement

Objeto que se va a buscar. Si el objeto de subárbol existe en el conjunto general de elementos que existen en las coordenadas de intersectingPoint especificadas, el valor devuelto contiene solo el objeto de subárbol y los objetos que tienen un orden Z mayor que el subárbol, enumerado por inverso de z-order. Si el objeto de subárbol no existe en coordenadas intersectingPoint , el valor devuelto estará vacío.

Devoluciones

Conjunto enumerable de objetos UIElement en la composición del árbol visual en el punto especificado, enumerado por inversa de z-order.

Atributos

Ejemplos

Se trata de un método de utilidad de ejemplo que determina si existe un elemento de un nombre determinado en cualquier lugar del orden z en un punto de la interfaz de usuario de una aplicación.

private bool DoesPointContainElement(Point testPoint, string elementName, UIElement referenceFrame)
{
    IEnumerable<UIElement> elementStack = 
      VisualTreeHelper.FindElementsInHostCoordinates(testPoint, referenceFrame);
    foreach (UIElement item in elementStack)
    {
        FrameworkElement feItem = item as FrameworkElement; 
//cast to FrameworkElement, need the Name property
        if (feItem != null)
        {
            if (feItem.Name.Equals(elementName))
            {
                 return true;
            }
        }
     }
     // elementName was not in this stack 
     return false;
}

Comentarios

El valor devuelto no es un único elemento, es una colección. La colección puede tener más de un elemento porque puede haber varios elementos de interfaz de usuario apilados entre sí en un orden z. Las técnicas convencionales de prueba de posicionamiento expuestas por los controladores de eventos de entrada, como el valor del remitente para un evento PointerPressed , solo tienen en cuenta el elemento superior que tiene el orden Z más alto. Los métodos FindElementsInHostCoordinates devuelven toda la pila de elementos que comparten ese punto o área en la interfaz de usuario de la aplicación, enumerados por inverso del orden z. El uso de FindElementsInHostCoordinates puede resultar útil para examinar casos en los que haya apilado de forma intencionada o involuntaria elementos. Es posible que desee corregir el orden de representación y pruebas de posicionamiento, o examinar ese orden por otros motivos.

FindElementsInHostCoordinates es útil para tres escenarios: pruebas básicas de posicionamiento, pruebas de posicionamiento que filtran por un elemento específico y determinan si hay elementos en un árbol visual que se sobredibujan en el mismo punto.

Pruebas básicas de posicionamiento

Para las pruebas de posicionamiento básicas, el objetivo es detectar qué elemento es el más alto en el orden z de una interfaz de usuario de la aplicación en un punto determinado en coordenadas x-y. Además de ser el elemento que dibuja más arriba en la interfaz de usuario representada, este elemento también es importante porque es el origen del evento notificado si hay interacciones del usuario como eventos de puntero. Es posible que tenga escenarios de prueba de posicionamiento en los que quiera saber qué elemento existe en el orden Z superior antes de que se produzca cualquier evento de entrada, de modo que pueda preverlo y, posiblemente, corregir los errores en la colocación de orden z.

En este escenario, debe pasar el punto que le interesa realizar pruebas de posicionamiento como el valor del parámetro intersectingPoint . Para el parámetro subárbol , puede pasarlo como null. O bien, puede especificar que el subárbol sea algún elemento que sepa que es el objeto visual raíz de una página o, de lo contrario, algún elemento que desea ser la parada final para las pruebas de posicionamiento.

El elemento que se encuentra más arriba en el orden z es siempre el primer elemento del elemento IEnumerable devuelto de los elementos UIElement . Por lo tanto, para las pruebas básicas de posicionamiento, normalmente solo está interesado en ese primer elemento. Los elementos adicionales de IEnumerable son otros elementos que también están en ese punto, pero están más atrás en el orden z y se dibujan debajo de ese primer elemento. Los elementos que están más atrás no se notificarían como el origen de un evento de entrada en ese momento, solo lo haría el elemento superior.

Pruebas de posicionamiento filtradas por elementos

A veces quiere saber si existe un elemento específico en un momento determinado de la interfaz de usuario. Si es así, puede especificar ese punto para intersectingPoint y especificar el elemento que busca como parámetro de subárbol . Si el valor devuelto no está vacío, significa que el elemento existe en ese punto de la interfaz de usuario. Si el elemento es el primer elemento del valor devuelto, significa que el elemento está más arriba en el orden z en intersectingPoint. Si hay otros elementos en el valor devuelto y el subárbol no es primero, los demás elementos representan los elementos que se representan en intersectingPoint que son superiores en orden z (visualmente, estos se representan en la parte superior del subárbol ). En ese caso , el subárbol es el último elemento del IEnumerable devuelto, no el primero.

Si el valor devuelto está vacío, significa que el elemento de subárbol no existía allí, en ningún valor de orden z.

Buscar un sobredraw o mirar el árbol visual completo

Una interfaz de usuario puede ser dinámica, especialmente si usa colecciones del enlace de datos para el rellenado de la interfaz de usuario. Por lo tanto, en ocasiones es necesario saber qué elemento está actualmente encima. Es posible que esté anticipando puntos en la aplicación en los que el usuario pueda interactuar y comprobar que las interacciones que pretende son posibles actualmente. En este escenario, normalmente se especifica un valor Point que representa algún punto conocido, como (0,0) que es actualmente una coordenada válida dentro de la ventana de la aplicación. Para el parámetro subárbol , puede pasarlo como null. O bien, puede especificar que el subárbol sea algún elemento que sepa que es el objeto visual raíz de una página o, de lo contrario, algún elemento que desea ser la parada final para las pruebas de posicionamiento.

Nota

Si pasas null para el subárbol, es posible que veas que el árbol visual contiene elementos que no están definidos por XAML de nivel de página, como un elemento Frame y ContentPresenter. Proceden del código de inicialización de la aplicación típico que existe en la mayoría de las plantillas de proyecto de Microsoft Visual Studio para una aplicación para UWP, que primero crea frame para que sea el valor Window.Content . El árbol visual tal como se muestra en los métodos FindElementsInHostCoordinates se extiende hasta Window.Content a menos que lo filtre con un elemento de subárbol , como una raíz de página .

En el valor devuelto, es posible que le interese cada uno de los elementos que contiene. Por lo tanto, puede usar técnicas específicas del lenguaje o similares para iterar la colección y ejecutar su propia lógica en cada uno de estos elementos. Recuerde que el primer elemento de esa colección es el que está más arriba en orden z.

Si está programando con C# o Microsoft Visual Basic, el tipo de valor devuelto de este método se proyecta como una colección genérica IEnumerable que contiene elementos UIElement . Si está programando con extensiones de componentes de Visual C++ (C++/CX), el tipo de valor devuelto de este método es IIterable<UIElement>.

Consulte también

Se aplica a

FindElementsInHostCoordinates(Rect, UIElement)

Recupera un conjunto de objetos que se encuentran dentro de un marco rect especificado de una interfaz de usuario de la aplicación. El conjunto de objetos representa los componentes de un árbol visual que comparten un área rectangular y podría incluir elementos que se sobredibujan.

public:
 static IIterable<UIElement ^> ^ FindElementsInHostCoordinates(Rect intersectingRect, UIElement ^ subtree);
/// [Windows.Foundation.Metadata.Overload("FindElementsInHostCoordinatesRect")]
 static IIterable<UIElement> FindElementsInHostCoordinates(Rect const& intersectingRect, UIElement const& subtree);
[Windows.Foundation.Metadata.Overload("FindElementsInHostCoordinatesRect")]
public static IEnumerable<UIElement> FindElementsInHostCoordinates(Rect intersectingRect, UIElement subtree);
function findElementsInHostCoordinates(intersectingRect, subtree)
Public Shared Function FindElementsInHostCoordinates (intersectingRect As Rect, subtree As UIElement) As IEnumerable(Of UIElement)

Parámetros

intersectingRect
Rect

Rectándelo que se va a utilizar como área de determinación. Este marco usa el espacio de coordenadas de la ventana de la aplicación, no de ningún elemento específico (y no del subárbol si se especifica).

subtree
UIElement

Objeto que se va a buscar. Si el objeto de subárbol existe en el conjunto general de elementos que existen dentro del objeto intersectingRect especificado, el valor devuelto contiene solo el objeto de subárbol y los elementos que se dibujan encima de su espacio. Si el objeto de subárbol no existe dentro del marco intersectingRect , el valor devuelto estará vacío.

Devoluciones

Conjunto enumerable de objetos UIElement que se encuentran en la composición del árbol visual en el marco Rect especificado.

Atributos

Ejemplos

Dada esta interfaz de usuario XAML:

<Canvas Name="canvas">
  <Rectangle Name="outermost" Fill="Red" Width="200" Height="200"/>
  <Rectangle Canvas.Left="40" Canvas.Top="40" Name="hidden" Fill="Green" Width="120" Height="120"/>
  <Rectangle Canvas.Left="40" Canvas.Top="40" Name="shown" Fill="Orange" Width="120" Height="120"/>
  <Rectangle Canvas.Left="80" Canvas.Top="80" Name="center" Fill="Yellow" Width="40" Height="40"/>
  <Rectangle Canvas.Left="190" Canvas.Top="190" Name="bottomright" Fill="Pink" Width="10" Height="10"/>
</Canvas>

Estos son algunos ejemplos de usos y resultados de FindElementsInHostCoordinates, con diferentes valores de subárbol :

private void Test(object sender, RoutedEventArgs e)
{
    IEnumerable<UIElement> hits;
    hits =  VisualTreeHelper.FindElementsInHostCoordinates(
      new Rect(75,75,50,50), canvas);
    foreach (UIElement element in hits)
    {
        //run logic here, such as log the results 
    }
// results in the following set of elements, listed by Name:
// center - the last declared XAML element is first returned, if within the area
// shown - renders, underneath 'center' in part of the area but visible on the edges
// hidden - entirely under 'shown', not visible but part of the area, an overdraw
// outermost - draws under all the above
// canvas - the 'subtree' value, and the last element reported

    hits = VisualTreeHelper.FindElementsInHostCoordinates(
      new Rect(75,75,50,50), center);
    foreach (UIElement element in hits) {
        //run logic here, such as log the results
    }
// results in only 'center', because it was 'subtree' and it's also topmost

    hits = VisualTreeHelper.FindElementsInHostCoordinates(
      new Rect(75,75,50,50), bottomright);
// results in an empty set, 'bottomright' isn't in the specified rect
}

Comentarios

El valor devuelto no es un único elemento, es una colección. La colección puede tener más de un elemento porque puede haber varios elementos de interfaz de usuario apilados entre sí en un orden z, y también varios elementos completamente o parcialmente en el marco intersectingRect . Las técnicas convencionales de prueba de posicionamiento expuestas por los controladores de eventos de entrada, como el valor del remitente para un evento PointerPressed , solo tienen en cuenta el elemento superior que tiene el orden Z más alto. Los métodos FindElementsInHostCoordinates devuelven toda la pila de elementos que comparten ese punto o área en la interfaz de usuario de la aplicación, enumerados por orden de árbol visual (que suele ser el mismo que el inverso del orden de declaración XAML). El uso de FindElementsInHostCoordinates puede resultar útil para examinar casos en los que haya apilado de forma intencionada o involuntaria elementos. Es posible que desee corregir el orden de representación y pruebas de posicionamiento, o examinar ese orden por otros motivos.

FindElementsInHostCoordinates sobre un área es útil para dos escenarios: pruebas básicas de posicionamiento y pruebas de posicionamiento que filtran por un elemento específico.

Pruebas básicas de posicionamiento

Para las pruebas de posicionamiento básicas, el objetivo es detectar qué elemento es el más alto en el orden z de una interfaz de usuario de la aplicación. Si realiza pruebas de posicionamiento para una interacción del mouse, puede usar un punto, pero para las pruebas de posicionamiento orientadas a la entrada táctil, a menudo es adecuado usar un área rectangular. Es posible que tenga escenarios de prueba de posicionamiento en los que quiera saber qué elemento existe en el orden Z superior antes de que se produzca cualquier evento táctil. O bien, es posible que tenga un punto que quiera expandir para que sea un rectángulo para ver lo que está cerca de un punto central y qué elemento podría ser el destino previsto.

En este escenario, debe pasar el rectángulo que le interesa en las pruebas de posicionamiento como el valor del parámetro intersectingRect . Para el parámetro subárbol , puede pasarlo como null. O bien, puede especificar que el subárbol sea algún elemento que sepa que es el objeto visual raíz de una página o, de lo contrario, algún elemento que desea ser la parada final para las pruebas de posicionamiento.

El orden del elemento en el IEnumerable devuelto de los elementos UIElement tiene en cuenta tanto el espacio de coordenadas en el área como para el orden z. Por lo tanto, es posible obtener aciertos para los elementos que no están en el orden Z más alto y, por lo tanto, no podrían ser el origen de los eventos de entrada. Para asegurarse de que puede realizar una prueba de posicionamiento filtrada por elementos para cualquier elemento de la lista devuelta en la que esté interesado, usando la misma intersectingRect pero pasando el elemento de interés como subárbol.

Pruebas de posicionamiento filtradas por elementos

A veces quiere saber si existe un elemento específico dentro de un área de la interfaz de usuario. Si es así, puede especificar ese área para intersectingRect y especificar el elemento que busca como parámetro de subárbol . Si el valor devuelto no está vacío, significa que el elemento existe en algún lugar de esa área. Cuando se realiza una prueba de posicionamiento de un área, el orden en el conjunto de devolución no es tan útil para determinar el orden z porque el conjunto incluye elementos en más de una coordenada x-y. El conjunto tiene una combinación de elementos que se dibujan en varias coordenadas x-y y, además, elementos que pueden ser totalmente o parcialmente sobredibujados. Para examinar realmente una situación de sobredraw, use las sobrecargas de FindElementsInHostCoordinates que usan un punto, de modo que las coordenadas x-y y y el orden del árbol visual ya no sean un factor. Consulta FindElementsInHostCoordinates(Point,UIElement).

Si el valor devuelto está vacío, significa que el elemento de subárbol no existía en el área.

Si está programando con C# o Microsoft Visual Basic, el tipo de valor devuelto de este método se proyecta como una colección genérica IEnumerable que contiene elementos UIElement . Si está programando con extensiones de componentes de Visual C++ (C++/CX), el tipo de valor devuelto de este método es IIterable<UIElement>.

Consulte también

Se aplica a

FindElementsInHostCoordinates(Point, UIElement, Boolean)

Recupera un conjunto de objetos que se encuentran dentro de un punto de coordenada x-y especificado de una interfaz de usuario de la aplicación. El conjunto de objetos representa los componentes de un árbol visual que comparten ese punto.

public:
 static IIterable<UIElement ^> ^ FindElementsInHostCoordinates(Point intersectingPoint, UIElement ^ subtree, bool includeAllElements);
/// [Windows.Foundation.Metadata.DefaultOverload]
/// [Windows.Foundation.Metadata.Overload("FindAllElementsInHostCoordinatesPoint")]
 static IIterable<UIElement> FindElementsInHostCoordinates(Point const& intersectingPoint, UIElement const& subtree, bool const& includeAllElements);
[Windows.Foundation.Metadata.DefaultOverload]
[Windows.Foundation.Metadata.Overload("FindAllElementsInHostCoordinatesPoint")]
public static IEnumerable<UIElement> FindElementsInHostCoordinates(Point intersectingPoint, UIElement subtree, bool includeAllElements);
function findElementsInHostCoordinates(intersectingPoint, subtree, includeAllElements)
Public Shared Function FindElementsInHostCoordinates (intersectingPoint As Point, subtree As UIElement, includeAllElements As Boolean) As IEnumerable(Of UIElement)

Parámetros

intersectingPoint
Point

Punto que se va a utilizar como punto de determinación. Este punto usa el espacio de coordenadas de la ventana de la aplicación, no de ningún elemento específico (y no del subárbol si se especifica).

subtree
UIElement

Objeto que se va a buscar. Si el objeto de subárbol existe en el conjunto general de elementos que existen en las coordenadas de intersectingPoint especificadas, el valor devuelto contiene solo el objeto de subárbol y los objetos que tienen un orden Z mayor que el subárbol, enumerado por inverso de z-order. Si el objeto de subárbol no existe en coordenadas intersectingPoint , el valor devuelto estará vacío.

includeAllElements
Boolean

bool

true para incluir todos los elementos que forman una intersección, incluidos los elementos que se consideran invisibles para las pruebas de posicionamiento. false para buscar solo elementos visibles y comprobables. El valor predeterminado es false.

Devoluciones

Conjunto enumerable de objetos UIElement que se determinan que se encuentran en la composición del árbol visual en el punto especificado, enumerado por inversa de z-order.

Atributos

Ejemplos

Dada esta interfaz de usuario XAML:

<Canvas Name="canvas">
  <Rectangle Name="outermost" Fill="Red" Width="200" Height="200"/>
  <Rectangle Canvas.Left="40" Canvas.Top="40" Name="hidden" Fill="Green" Width="120" Height="120"/>
  <Rectangle Canvas.Left="40" Canvas.Top="40" Name="shown" Fill="Orange" Width="120" Height="120"/>
  <Rectangle Canvas.Left="80" Canvas.Top="80" Name="center" Fill="Yellow" Width="40" Height="40"/>
  <Rectangle Canvas.Left="190" Canvas.Top="190" Name="bottomright" Fill="Pink" Width="10" Height="10"/>
</Canvas>

Estos son algunos ejemplos de usos y resultados de FindElementsInHostCoordinates, con diferentes valores de subárbol :

private void Test(object sender, RoutedEventArgs e)
{
    IEnumerable<UIElement> hits;
    hits =  VisualTreeHelper.FindElementsInHostCoordinates(
      new Point(100,100), canvas, true);
    foreach (UIElement element in hits)
    {
        //run logic here, such as log the results 
    }
// results in the following set of elements, listed by Name:
// center - the element that is topmost in z-order at 100,100
// shown - also renders at 100,100 but is underneath 'center'
// hidden - is entirely underneath 'shown', 
//   and lower in z-order because 'hidden' declared before 'shown' in XAML
// outermost - draws under all the above at 100,100
// canvas - the 'subtree' value, so that's the last element reported

    hits = VisualTreeHelper.FindElementsInHostCoordinates(
      new Point(100, 100), center, true);
    foreach (UIElement element in hits) {
        //run logic here, such as log the results
    }
// results in 'center', because it is 'subtree' and also topmost

    hits = VisualTreeHelper.FindElementsInHostCoordinates(
      new Point(100, 100), bottomright, true);
// results in an empty set, 'bottomright' doesn't render at 100,100
}

Comentarios

Un elemento se considera apto para pruebas de posicionamiento si ambos ocupan espacio en el diseño y "produce entrada de lápiz". En el caso de los elementos que tienen un brush, cualquier pincel que no sea NULL se considera algo que genera entrada de lápiz, incluso si el pincel no genera píxeles visibles. Por ejemplo, un SolidColorBrush con su color establecido en Transparent sigue produciendo tinta. Solo un pincel nulo no produce entrada de lápiz. No se tiene en cuenta la propiedad Opacity. El elemento sigue produciendo entrada de lápiz incluso si es opacidad 0.

Cuando el parámetro includeAllElements se establece en true, los elementos que no producen entrada de lápiz se consideran para las pruebas de posicionamiento. En este caso, siempre y cuando el elemento cumpla los requisitos espaciales (el punto interseca los límites del elemento), después y sus antecesores se incluyen en los resultados.

Nota

Algunos elementos especiales, como SwapChainPanel y MediaElement, no tienen un pincel, pero todavía pueden producir tinta.

Consulte también

Se aplica a

FindElementsInHostCoordinates(Rect, UIElement, Boolean)

Recupera un conjunto de objetos que se encuentran dentro de un marco rect especificado de una interfaz de usuario de la aplicación. El conjunto de objetos representa los componentes de un árbol visual que comparten un área rectangular y podría incluir elementos que se sobredibujan.

public:
 static IIterable<UIElement ^> ^ FindElementsInHostCoordinates(Rect intersectingRect, UIElement ^ subtree, bool includeAllElements);
/// [Windows.Foundation.Metadata.Overload("FindAllElementsInHostCoordinatesRect")]
 static IIterable<UIElement> FindElementsInHostCoordinates(Rect const& intersectingRect, UIElement const& subtree, bool const& includeAllElements);
[Windows.Foundation.Metadata.Overload("FindAllElementsInHostCoordinatesRect")]
public static IEnumerable<UIElement> FindElementsInHostCoordinates(Rect intersectingRect, UIElement subtree, bool includeAllElements);
function findElementsInHostCoordinates(intersectingRect, subtree, includeAllElements)
Public Shared Function FindElementsInHostCoordinates (intersectingRect As Rect, subtree As UIElement, includeAllElements As Boolean) As IEnumerable(Of UIElement)

Parámetros

intersectingRect
Rect

Rectándelo que se va a utilizar como área de determinación. Este marco usa el espacio de coordenadas de la ventana de la aplicación, no de ningún elemento específico (y no del subárbol si se especifica).

subtree
UIElement

Objeto que se va a buscar. Si el objeto de subárbol existe en el conjunto general de elementos que existen dentro del objeto intersectingRect especificado, el valor devuelto contiene solo el objeto de subárbol y los elementos que se dibujan encima de su espacio. Si el objeto de subárbol no existe dentro del marco intersectingRect , el valor devuelto estará vacío.

includeAllElements
Boolean

bool

true para incluir todos los elementos que forman una intersección, incluidos los elementos que se consideran invisibles para las pruebas de posicionamiento. false para buscar solo elementos visibles y comprobables. El valor predeterminado es false.

Devoluciones

Conjunto enumerable de objetos UIElement que se determinan que se encuentran en la composición del árbol visual en el marco rect especificado.

Atributos

Ejemplos

Dada esta interfaz de usuario XAML:

<Canvas Name="canvas">
  <Rectangle Name="outermost" Fill="Red" Width="200" Height="200"/>
  <Rectangle Canvas.Left="40" Canvas.Top="40" Name="hidden" Fill="Green" Width="120" Height="120"/>
  <Rectangle Canvas.Left="40" Canvas.Top="40" Name="shown" Fill="Orange" Width="120" Height="120"/>
  <Rectangle Canvas.Left="80" Canvas.Top="80" Name="center" Fill="Yellow" Width="40" Height="40"/>
  <Rectangle Canvas.Left="190" Canvas.Top="190" Name="bottomright" Fill="Pink" Width="10" Height="10"/>
</Canvas>

Estos son algunos ejemplos de usos y resultados de FindElementsInHostCoordinates, con diferentes valores de subárbol :

private void Test(object sender, RoutedEventArgs e)
{
    IEnumerable<UIElement> hits;
    hits =  VisualTreeHelper.FindElementsInHostCoordinates(
      new Rect(75,75,50,50), canvas, true);
    foreach (UIElement element in hits)
    {
        //run logic here, such as log the results 
    }
// results in the following set of elements, listed by Name:
// center - the last declared XAML element is first returned, if within the area
// shown - renders, underneath 'center' in part of the area but visible on the edges
// hidden - entirely under 'shown', not visible but part of the area, an overdraw
// outermost - draws under all the above
// canvas - the 'subtree' value, and the last element reported

    hits = VisualTreeHelper.FindElementsInHostCoordinates(
      new Rect(75,75,50,50), center, true);
    foreach (UIElement element in hits) {
        //run logic here, such as log the results
    }
// results in only 'center', because it was 'subtree' and it's also topmost

    hits = VisualTreeHelper.FindElementsInHostCoordinates(
      new Rect(75,75,50,50), bottomright, true);
// results in an empty set, 'bottomright' isn't in the specified rect
}

Comentarios

Un elemento se considera apto para pruebas de posicionamiento si ambos ocupan espacio en el diseño y "produce entrada de lápiz". En el caso de los elementos que tienen un brush, cualquier pincel que no sea NULL se considera algo que genera entrada de lápiz, incluso si el pincel no genera píxeles visibles. Por ejemplo, un SolidColorBrush con su color establecido en Transparent sigue produciendo tinta. Solo un pincel nulo no produce entrada de lápiz. No se tiene en cuenta la propiedad Opacity. El elemento sigue produciendo entrada de lápiz incluso si es opacidad 0.

Cuando el parámetro includeAllElements se establece en true, los elementos que no producen entrada de lápiz se consideran para las pruebas de posicionamiento. En este caso, siempre y cuando el elemento cumpla los requisitos espaciales (el rectángulo interseca los límites del elemento), a continuación, y sus antecesores se incluyen en los resultados.

Nota

Algunos elementos especiales, como SwapChainPanel y MediaElement, no tienen un pincel, pero todavía pueden producir tinta.

Consulte también

Se aplica a