“x 名称空间”的这个x是映射XML名称空间时给它取的名字;x名称空间里的成员是专门写给XAML编译器看的、用来引导XAML编译器把XAML代码编译成CLR代码。
1:x 名称空间里都有什么
x 名称空间映射的是xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml",望文生义,它包含的类均与解析XAML语言相关,所以亦可称之为“XAML 名称空间”。
2:x 名称空间中的Attribute
Attribute和Property是两个层面的东西。Attribute是语言层面的东西、是给编译器看的,Property是面向对象层面的东西、是给编程逻辑用的,而且一个XAML标签的Attribute里大部分都对应着对象的Property。在使用XAML编程的时候,如果你想给他加上一些特殊的标记从而影响XAML编译器对它的解析。这时候就需要额外为它添加一些Attribute了。
1:x:Class
这个Attribute的作用是告诉XAML编译器将XAML标签的编译结构和后台代码中指定的类合并。在使用x:class时必须遵循以下要求:
(1)这个Attribute只能用于根节点。
(2)使用x:Class的根节点的类型要与x:Class的值所指示的类型保持一致。
(3)x:Class的值所指示的类型在声明时必须使用partial关键字。
2:x:ClassModifier
这个Attribute的作用是告诉XAML编译由标签编译生成的类具有怎么样的访问控制级别。
使用这个Attribute时需要注意:
(1)标签必须具有x:Class Attribute。
(2)x:ClassModifier的值必须与x:Class所指示类的访问控制级别一致。
(3)x:ClassModifier的值随后台代码的编译语言不同而有所不同。
3:x:Name
x:Name作用:
(1)告诉XAML编译器,当一个标签带有x:Name时除了为这个标签生成的对应实例外还要为这个实例声明一个引用变量,变量名就是x:Name的值。
(2)将XAML标签所对应对象的Name属性也设为X:Name的值,并把这个值注册到UI树上,以方便查找。
Name属性定义在FrameworkElement类中,这个类使WPF空间的基类,所以所有WPF控件都具有Name这个属性。当一个元素具有Name属性时,使用Name或x:Name效果是一样的。Name和x:Name不能同时出现在一个元素中。对于那些没有Name属性的元素,为了在XAML声明时也创建引用变量以便在C#代码中访问,我们就只能使用x:Name。因为x:Name的功能涵盖了Name属性的功能,所以全部使用x:Name以增强代码的统一性和可读性。
4:x:FieldModifier
使用x:Name后,XAML标签对应的实例就具有了自己的引用变量,而且这些引用变量都是类的字段。既然是类的字段就免不了要关注一下它们的访问级别。默认情况下,这些字段的访问级别按照面向对象的封装原则被设置成了internal。在编程的时候。有时候我们需要从程序集访问另一个程序集中窗体的元素,这时候就需要把被访问的控件的引用变量改为public级别,x:FieldModifier就是用来在XAML里改变引用变量的访问级别的。
5:x:Key
最自然的检索方式莫过于使用"Key-Value"对的形式了。在XAML文件中,我们可以把很多需要多次使用的内容提取出来放在资源字典里,需要使用使用这个资源的时候就用它的Key把它检索出来。
Key的作用就是为资源贴上用于检索的索引。在WPF中,几乎每个元素都有自己的Resources属性,这个属性是个“Key-Value”式的集合,只要把元素放进这个集合,这个元素就成为资源字典中的一个条目,当然,为了能够检索到这个条件,就必须为它添加x:Key。资源(Resources)在WPF中非常重要,需要重复使用的XAML内容,如Style、各种Template和动画等都需要放在资源里。
<Window x:Class="MyFirstApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyFirstApplication"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<sys:String x:Key="myString">hello</sys:String>
</Window.Resources>
<Grid>
<TextBox Text="{StaticResource myString}" Margin="5"/>
</Grid>
</Window>
6:x:Shared
x:Shared一定要与x:Key配合使用,如果x:Shared的值为true,那么每次检索到这个对象时,我们得到的都是同一对象,否则如果x:Shared的值为false,那么每次检索到这个对象时,我们得到的都是这个对象的新副本。XAML编译器会为资源隐藏添加x:Shared=“true”,也就是说,默认情况下我们的到的都是同一对象。
3:x名称空间中的标记扩展
标记扩展(Markup Extension)实际上就是一些MarkupExtension类的直接或者间接派生类。x名称空间中就包含有一些这样的类,所以常称它们为x名称空间内的标记扩展。
1:x:Type
x:Type的值应该是一个数据类型的名称。一般情况下,我们在编程中操作的是数据类型的实例或者是实例的引用,但有时候我们也会用到数据类型本身。
当我们在XAML中想表达某个数据类型时就需要使用x:Type标记扩展。
2:x:Null
有时候我们需要显示地对一个属性赋空值。在C#语言里,使用null关键字来表示空值,在XAML里用来表示空值的是x:Null。
3:x:Array
x:Array的作用就是通过它的Item属性向使用者暴露一个类型已知的ArrayList实例,ArrayList内成员的类型由x:Array的Type指明。
4:x:Static
x:Static是一个很常见的标记扩展,它的功能是在XAML文档中使用数据类型的static成员。因为XAML不能编写逻辑代码,所以使用x:Static访问的static成员一定是数据类型的属性或字段。
5:x:XData
x:XData标签是一个专用标签。WPF中把包含数据的对象称为数据源,用于把数据源中的数据提供给数据使用者的对象被称为数据提供者。WPF类库中包含多种数据提供者,其中有一个类叫XmlDataProvider,专门用于提供XML化的数据。如果想在XAML里声明一个带有数据的XmlDataProvider实例,那么XmlDataProvider实例的数据就要放在x:XData标签的内容里。
参考教材书:深入浅出WPF 刘铁猛 著