WPF XAML X名称空间详解

X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML编译器将XAML代码编译为CLR代码。

【X名称空间里面到底都有些什么】

x名称空间映射的是:,望文生义,它包含的类均与解析XAML语言相关,所以亦称之为“XAML名称空间”。

与C#语言一样,XAML也有自己的编译器。XAML语言被解析并编译,最终形成微软中间语言保存在程序集中。在解析和编译XAML的过程中,我们经常要告诉编译器一些重要的信息,如XAML编译的结果应该和哪个C#代码编译的结果合并、使用XAML声明的元素是public还是private访问级别等等。这些让程序员能够与XAML编译器沟通的工具就存在X:名称空间中。

我们注意到,它分为Attribute、标签扩展、XAML指令元素三个种类。下面我们讲讲它们的具体用法:

【X名称空间中的Attribute】

前面我们已经讲过,Attribute和Property是两个层面上的东西,Attribute是语言层面上的东西,是给编译器看的,Property是面向对象层面上的东西,是给编程逻辑看。而且一个标签中的Attribute大部分对应对象的Property。在使用XAML编程的时候,如果你想给它加一点特殊的标记来改变XAML对它的解析,这时候就需要额外的给它添加一些Attribute了。比如,你想告诉XAML编译器将哪个编译结果和那个C#编译的类合并,这时候就必须为这个标签添加X:Class Attribute来告诉编译器。X:Class并不是对象成员,而是从X名称空间里拿出来硬贴上去的。让我们浏览一下常用的Attribute。

【x:Class】 这个Attribute是告诉XAML编译器将XAML编译器编译的结果和后台编译结果的哪一个类进行合并,

使用x:Class有以下几点要求:

这个Attribute只能用于根节点。使用x:Class的根节点的类型要与x:Class的值所指示的一致。x:Class的值所指示的类型在声明的时候必须使用partial关键字。x:Class已经在剖析最简单的XAML的时候已经讲过,在这就不多讲了。

【X:ClassModiffier】 是告诉XAML编译器由标签编译成的类具有什么样的访问级别。

使用这个Attribute的时候需要注意的是:标签必须具有x:Class Attribute。X:ClassModiffier的值必须与X:Class所指定类的访问权限一致。X:ClassModiffier的值随后台代码编译语言的不同而有所不同。

例子:

<Window x:Class="WpfApplication4.wnd422"x:ClassModifier="internal"xmlns=""xmlns:x=""Title="wnd422" Height="350" Width="525"/>

对应的C#代码:

/// <summary>/// wnd422.xaml 的交互逻辑/// </summary>internal partial class wnd422 : Window{public wnd422(){InitializeComponent();}

【X:Name】 我们之前已经提过XAML是一种声明式语言,但你是否想过XAML标签声明的是什么呢?其实,XAML标签声明的是对象,一个XAML标签对应着一个对象,这个对象一般是一个控件类的实例。在.NET平台上,类是引用类型。引用类型的实例一般都是以“引用者—实例”的形式成对出现的,而且我们只能通过引用者来访问实例。当一个实例不在被任何引用者引用的时候,它将作为内存垃圾被销毁。常见的引用者是引用变量,但不是唯一的。

X:Name的作用有两个:(1)告诉编译器,当一个标签带有x:Name时,除了为这个标签生成实例还要给这个标签声明一个引用变量,变量名就是x:Name的值。(2)将XAML标签所对应的Name属性(如果有)也设置为x:Name值,并把这个值注册到UI树上,以方便查找。

【x:FieldModifier】 使用了x:Name后,XAML标签对应的实例就具有了自己的引用变量,而且这些引用变量都是类的字段,既然这样就不免要关注一下它的访问级别。默认情况下这些字段的级别都被设置成了Internal。在编程的时候,有的时候需要用一个程序集里的一个窗体元素访问到另一个程序集的窗体元素,那么就需要使用x:FieldModifier来改变引用变量的访问级别!

因为x:FidleModifier是引用变量的访问级别,所以要配合x:Name一起使用。否则没有引用变量,何来引用变量访问级别。

只有一条路不能拒绝——那就是成长的路。

WPF XAML X名称空间详解

相关文章:

你感兴趣的文章:

标签云: