FrameworkElement.FindName(String) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
检索具有指定标识符名称的对象。
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
请求的对象的名称。
返回
请求的对象。 如果在当前 XAML 名称范围中找不到匹配的对象,则此值可以为 null。
注解
重要
为了有效地使用 FindName 方法,应了解 XAML 名称范围的概念,以及如何在 XAML 加载时创建 XAML 名称范围,然后在运行时引用并可能对其进行修改。 有关详细信息,请参阅 XAML 名称范围。
FindName 在Windows 运行时代码中最常见的用法来自为 XAML 页面生成的 InitializeComponent 调用。 在这种情况下,仅在加载 XAML 页面后调用 FindName。 InitializeComponent 提供了基础结构,以便代码隐藏代码可以方便地访问通过 XAML 加载实例化的任何对象。 然后,可以将对象引用为与标记声明的 x:Name 属性共享同名的变量。
运行时 API(如 FindName)正针对内存中存在的应用的运行时对象树运行。 从模板或运行时加载的 XAML 创建此对象树的一部分时,XAML 名称范围通常不在该对象树中连续。 结果是,对象树中可能存在给定 FindName 范围找不到的命名对象。 在典型应用程序方案中,在 XAML 名称范围之间可能会遇到不连续的情况是,通过应用模板创建对象,或者通过调用 XamlReader.Load 创建对象并随后添加到对象树。
如果为 FindName 返回意外的 null 结果,请尝试以下方法:
- 对于来自模板的命名对象,如果要从控件定义或派生,则可以从应用模板的对象范围调用 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。 FindName 的任一实现的调用都可以遍历到混合的 FrameworkElement/text 元素对象树中,并使用通用 XAML 名称范围,以便 FrameworkElement.FindName 调用可以找到命名的文本元素,反之亦然。
在对象树中运行时添加或更改的名称值将更新为对象树中该级别的操作 XAML 名称范围。 换句话说,如果创建新的 FrameworkElement,请为其指定 名称,然后将其添加到对象树,从该 XAML 名称范围中调用 FindName 可以查找并返回代码创建的对象。