在更广阔的编程或计算机科学环境中,编程概念一般都会遵守一个原则:即具备可用于访问对象的唯一标识符或名称。 对于使用标识符或名称的系统,名称范围用于定义边界,过程或技术将在边界内搜索是否请求了该名称的对象,或在边界之内强制标识名称具有唯一性。 这些一般原则适用于 XAML 名称范围。 在 WPF 中,当加载 XAML 页时,会在该页的根元素上创建 XAML 名称范围。 从页的根开始,XAML 页中指定的每个名称都将添加到相关的 XAML 名称范围内。
在 WPF XAML 中,XAML 名称范围始终由作为常见根元素的元素(如 Page 和 Window)进行控制。 如果在标记中某个元素(例如 FrameworkElement 或FrameworkContentElement)是页的根元素,则 XAML 处理器将隐式添加一个 Page 根元素,以使 Page 可以提供工作 XAML 范围。
说明 |
即使在 XAML 标记中的任何元素上都没有定义 Name 或 x:Name 特性,WPF 生成操作也会为 XAML 生产创建 XAML 名称范围。 |
如果尝试在任意 XAML 名称范围中两次使用同一个名称,则会引发异常。 对于采用代码隐藏技术并且是已编译的应用程序一部分的 WPF XAML,如果在标记的初始编译过程中创建页的已生成类,WPF 生成操作将在生成时引发该异常。 对于不是由任何生成操作进行标记编译的 XAML,在加载该 XAML 时可能会引发与 XAML 名称范围相关的异常。 XAML 设计人员也可以在设计时预测 XAML 名称范围问题。
向运行时对象树添加对象
XAML 的分析时间表示 WPF XAML 名称范围的创建和定义时间。 如果在对生成对象树的 XAML 进行分析后的某一时刻向树中添加对象,则新对象的 Name 或x:Name 值不会自动更新 XAML 名称范围内的信息。 若要在加载 XAML 后将对象的名称添加到 WPF XAML 名称范围中,必须对定义 XAML 名称范围的对象(通常为 XAML 页的根)调用相应的 RegisterName 实现。 如果该名称未注册,则无法通过 FindName 这类方法按名称引用添加的对象,并且无法将该名称用于动画目标。
对于应用程序开发人员最常见的方案是将使用 RegisterName 将名称注册到页面当前根元素的 XAML 名称范围中。 RegisterName 是用于确定动画目标对象的演示图板的重要方案的一部分。 有关更多信息,请参见演示图板概述。
如果对定义 XAML 名称范围的对象以外的对象调用 RegisterName,则名称仍将注册到保存调用对象的 XAML 名称范围,就像对定义对象的 XAML 名称范围调用 RegisterName 一样。
代码中的 XAML 名称范围