XAML 解析器(BamlRecordReader)注册名字的时候并没有去爬可视化树什么的,只是单纯在解析 XAML 的时候去调用代码注册这个名字而已。注册由一个 Stack 来完成,NameScopeStack。
设想以下这个例子(来自于 .NET Framework 代码中的注释):
<Window x:Name="myWindow">
...
<Style x:Name="myStyle">
...
<SolidColorBrush x:Name="myBrush">
</SolidColorBrush>
</Style>
</Window>
每当 XAML 解析器解析一层的时候,就会给 NameScopeStack 入栈,于是 Window 首先创建 NameScope 入栈。随后解析到 Style 时又加一个 NameScope 入栈,其他元素解析时不会创建 NameScope(包括 XAML 中的顶层元素 UserControl 等)。
这时,myWindow 会被注册到 Window 一层的 NameScope 中,myStyle 也会注册到 Window 一层的 NameScope 中;而 myBrush 则会注册到 Style 那一层的 NameScope 中。
Window 的 NameScope
- myWindow
-
myStyle
Style 的 NameScope
-
myBrush
NameScope 的名称查找规则
在本文一开始贴出 NameScope 依赖项属性的时候,你应该注意到这只是一个普通的属性,并没有使用到什么可以用可视化树继承这样的高级元数据。事实上也不应该有这样的高级元数据,因为 NameScope 的抽象级别低于可视化树或者逻辑树。
-
myBrush










