FrameworkElement.FindName(String) Método

Definición

Recupera un objeto que tiene el nombre de identificador especificado.

public:
 virtual Platform::Object ^ FindName(Platform::String ^ name) = FindName;
IInspectable FindName(winrt::hstring const& name);
public object FindName(string name);
function findName(name)
Public Function FindName (name As String) As Object

Parámetros

name
String

Platform::String

winrt::hstring

Nombre del objeto solicitado.

Devoluciones

Object

Platform::Object

IInspectable

Objeto solicitado. Puede ser null si no se encontró ningún objeto coincidente en el ámbito de nombres XAML actual.

Comentarios

Importante

Para usar el método FindName de forma eficaz, debes comprender el concepto de un ámbito de nombres XAML y cómo se crea un ámbito de nombres XAML en tiempo de carga XAML y, a continuación, se hace referencia y posiblemente se modifica en tiempo de ejecución. Para obtener más información, consulta Ámbitos de nombres XAML.

El uso más común de FindName en el código de Windows Runtime será desde la llamada de InitializeComponent generada para una página XAML. En esta situación, FindName se invoca solo después de cargar la página XAML. InitializeComponent proporciona la infraestructura para que el código de código subyacente pueda tener acceso a cualquier objeto al que se haya creado una instancia mediante la carga de XAML. A continuación, puede hacer referencia a los objetos como una variable que comparte el mismo nombre que el atributo x:Name declarado por marcado.

Una API en tiempo de ejecución, como FindName, funciona con un árbol de objetos en tiempo de ejecución de la aplicación tal como existe en la memoria. Cuando parte de este árbol de objetos se crea a partir de plantillas o XAML cargado en tiempo de ejecución, normalmente un ámbito de nombres XAML no es contiguo dentro de ese árbol de objetos. El resultado es que puede haber un objeto con nombre en el árbol de objetos que un ámbito FindName determinado no encuentra. Las discontinuidades entre ámbitos de nombres XAML que se pueden encontrar en escenarios de aplicación típicos son cuando se crean objetos aplicando una plantilla, o cuando se crean objetos mediante una llamada a XamlReader.Load y posteriormente se agregan al árbol de objetos.

Si devuelve un resultado nulo inesperado para FindName, pruebe estas técnicas:

  • Para los objetos con nombre que proceden de una plantilla, si va a definir o derivar de un control, puede llamar a GetTemplateChild desde el ámbito del objeto donde se aplica la plantilla. Debe estar en un ámbito de definición de clase derivada para usar GetTemplateChild, ya que es un método protegido de Control.
  • Si no está en un ámbito de definición de clase derivada, es posible que pueda escribir el árbol visual de una plantilla mediante VisualTreeHelper en un punto de vigencia del objeto después de aplicar la plantilla (controle el evento Loaded ). VisualTreeHelper usa una metáfora de elementos primarios y secundarios para caminar por el árbol, en lugar de usar el concepto de ámbito de nombres XAML. Caminar por el árbol generalmente requiere un conocimiento específico de la composición del control a medida que procede de una plantilla determinada. Puedes usar VisualTreeHelper.GetChild en el control para obtener la raíz de la plantilla aplicada del control y llamar a FindName específicamente en la raíz de la plantilla para tener acceso a los elementos denominados dentro del XAML de la plantilla.
  • Para el caso XamlReader.Load , debes conservar una referencia al valor devuelto de la llamada XamlReader.Load , que es un objeto que se convertirá en el propietario o base del ámbito de nombres XAML creado que sea relevante. A continuación, llame a FindName desde ese ámbito en su lugar.

El objeto devuelto por FindName no es necesariamente un FrameworkElement. Por ejemplo, puede aplicar un nombre a un guión gráfico de animación y los distintos tipos de guion gráfico de animación no derivan de FrameworkElement.

La propiedad Name de un objeto (o el atributo x:Name similar) se asigna especificando un atributo en un elemento object en el marcado XAML. Puedes establecer un valor name después de cargar el CÓDIGO XAML de origen inicial, pero esta técnica tiene algunas limitaciones (consulta Comentarios en Nombre).

TextElement define un findName similar. Esto habilita un comportamiento FindName en el modelo de objetos, que no se limita a FrameworkElement. Las llamadas por cualquiera de las implementaciones de FindName pueden atravesar un árbol de objetos de elemento frameworkElement /text mixto y usar un ámbito de nombres XAML común para que una llamada FrameworkElement.FindName pueda encontrar un elemento de texto con nombre y viceversa.

Los valores de nombre que se agregan o cambian en tiempo de ejecución en el árbol de objetos se actualizarán al ámbito de nombres XAML que actúa en ese nivel en el árbol de objetos. En otras palabras, si creas un nuevo FrameworkElement, asígnele un nombre y, a continuación, agréguelo al árbol de objetos, llamando a FindName desde ese ámbito de nombres XAML puede buscar y devolver el objeto creado con código.

Se aplica a

Consulte también