FrameworkElement.FindName(String) 方法

定义

检索具有指定标识符名称的对象。

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

参数

name
String

Platform::String

winrt::hstring

请求的对象的名称。

返回

Object

Platform::Object

IInspectable

请求的对象。 如果在当前 XAML 名称范围中找不到匹配的对象,则此值可以为 null。

注解

重要

为了有效地使用 FindName 方法,应了解 XAML 名称范围的概念,以及如何在 XAML 加载时创建 XAML 名称范围,然后在运行时对其进行引用和修改。 有关详细信息,请参阅 XAML 名称范围

在Windows 运行时代码中, 的最常见用法FindName是在生成的 XAML 页面调用中InitializeComponent。 在这种情况下, FindName 仅在加载 XAML 页面后调用。 InitializeComponent 提供基础结构,以便代码隐藏代码可以方便地访问由 XAML 加载实例化的任何对象。 然后,可以将对象引用为与标记声明的 x:Name 属性共享同名的变量。

运行时 API(如 ) FindName 针对应用的运行时对象树工作,因为它存在于内存中。 从模板或运行时加载的 XAML 创建此对象树的一部分时,XAML 名称范围通常不在该对象树中连续。 结果是,对象树中可能存在给定 FindName 范围找不到的命名对象。 在典型应用程序方案中,XAML 名称范围之间可能会遇到的不连续性是:通过应用模板创建对象,或者通过调用 XamlReader.Load 创建对象并随后添加到对象树中。

如果为 返回意外的 FindNamenull 结果,请尝试以下方法:

  • 对于来自模板的命名对象,如果要从控件定义或派生,则可以从应用模板的对象的范围调用 GetTemplateChild 。 必须位于派生类定义范围内才能使用 GetTemplateChild,因为它是 Control 的受保护方法。
  • 如果不在派生类定义范围内,则可以在应用模板后在对象生存期的某个时间点使用 VisualTreeHelper 进入模板的可视化树, (处理 Loaded 事件) 。 VisualTreeHelper 使用父子隐喻来遍视树,而不是使用 XAML 名称范围概念。 遍视树通常需要对控件的构成有特定了解,因为它来自给定的模板。 可以在控件上使用 VisualTreeHelper.GetChild 获取控件的应用模板根,并专门在模板根上调用 FindName 以访问模板 XAML 中命名的元素。
  • 对于 XamlReader.Load 情况,应保留对 XamlReader.Load 调用的返回值的引用,该调用是一个对象,将成为所创建 XAML 名称范围的相关所有者或基础。 然后改为从该范围调用 FindName

返回 FindName 的对象不一定是 FrameworkElement。 例如,可以将名称应用于动画情节提要,并且各种动画情节提要类型不派生自 FrameworkElement

对象的 Name 属性 (或类似的 x:Name 属性) 通过在 XAML 标记中的对象元素上指定属性来分配。 可以在加载初始源 XAML 后设置 Name 值,但此方法存在一些限制, (请参阅 名称) 中的“备注”。

TextElement 定义类似的 FindName。 这将启用 FindName 对象模型中的行为,该行为不限于 FrameworkElement。 通过 的任一FrameworkElement.FindName实现FindName调用都可以遍历到混合的 FrameworkElement/文本元素对象树中,并使用通用的 XAML 名称范围,以便调用可以找到命名的文本元素,反之亦然。

在对象树中运行时添加或更改的名称值将更新为对象树中该级别的操作 XAML 名称范围。 换句话说,如果创建新的 FrameworkElement,请为其指定 一个名称,然后将其添加到对象树中,从该 XAML 名称范围中调用 FindName 可以查找并返回代码创建的对象。

适用于

另请参阅