经过对前面2节对XAML的介绍,咱们对XAML有了必定的认识。这一节咱们来简单了解一下部分XAML命名空间(x:)语言功能。ide
x命名空间映射的是http://schemas.microsoft.com/winfx/2006/xaml,它包含的类与解析XAML语言相关。与C#语言同样,XAML也有本身的编译器。XAML文档会被解析并编译,最终造成IL存储在程序集中。在解析和编译XAML的过程当中,咱们须要告诉编译器一些信息,好比XAML代码编译结果与那个C#代码的编译结果合并等。这些能让咱们与XAML编译器沟通的工具就放在x名称空间中。工具
经过x命名空间在XAML中出现的形式,咱们能够分为以下几类:ui
· Attributethis
· 标记扩展spa
· XAML指令元素3d
接下来咱们就来介绍一下其中主要的功能。code
一. x命名空间中的Attributeorm
1. x:Classxml
这个Attribute的做用是告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并。语法为:对象
<object x:Class="namespace.classname"...> ... </object>
这个Attribute只能用于根节点
namespace可填。指定一个包含由 classname 标识的分部类的 CLR 命名空间。 若是指定了 namespace,则用一个点 (.) 来分隔 namespace 和 classname。
classname必填。而且必须与该代码隐藏相链接的分部类的名称对应。而且代码隐藏相链接的类必须使用部分类,也就是partial关键字修饰。
2. x:ClassModifier
在同时提供了 x:Class 的状况下,修改 XAML 编译行为,告诉由标签生成的类具备怎样的访问控制级别。
使用时必须注意:
· 必须同时具备x:Class
· 必须与x:Class所指示类的访问控制级别一致。分为public(默认的)和internal2种。
3. x:Name
若是咱们经过XAML声明了一个元素,XAML编译器会为咱们生成一个与该元素对应的对象。可是若是咱们想在代码中找到该元素并使用,就必须为该对象声明一个引用类型的变量。这个时候x:Name就派上用场了。
它具备2个做用:
· 告诉XMAL编译器,当一个标签元素带有x:Name时,除了要生成对应的实例,还要生成一个引用类型的变量,这个变量名就是x:Name的值。
· 讲生成对象的Name属性(若是有)也设置成x:Name的值,并把这个值注册到UI树上,方便查找。
在XAML中,必须为类声明了RuntimeNameProperty特性才能使用Name,它和x:Name是等效的。
咱们查看StackPanel的源代码,发如今间接基类FrameworkElement中,使用了RuntimeNameProperty("Name")特性,全部在使用XAML的时候才有Name属性。
咱们不能同时设置Name和x:Name。最好使用x:Name,由于有的元素没有Name这个Attribute,而且x:Name的功能覆盖了Name的功能。
4. x:FileModifier
在使用x:Name后,XAML元素对应的实例就有了本身的引用类型的变量,这些变量都是类的字段。这些字段的访问级别默认都是internal的,若是咱们想改变他的访问级别,就可使用x:FileModifier。
须要注意的一点就是x:FileModifier,必需要和x:Name(或Name)一块儿使用。
5. x:key
在XAML中,咱们能够把须要屡次使用的内容提取出来放在资源字典中,须要使用这个资源字典的时候就要使用它的key检索出来。语法为:
<object x:Key="stringKeyValue".../> -or- <object x:Key="{markupExtensionUsage}".../>
第一种是要用做键的文本字符串。 文本字符串必须符合XamlName语法。
第二种是使用标记扩展。
在XAML中定义的资源的x:key,一样可使用this.FindResource("keyName")方法在代码隐藏文件中访问。
6. x:Shared
该Attribute必须和x:key同时使用。当咱们把某些对象做为资源放进资源字典后,能够把它检索出来反复使用。那么当咱们每次检索的时候,是同一个对象,仍是多个对象的副本就须要设置x:Shared的值。默认值为true,当设置成false的时候,会修改 WPF 资源检索行为,以便特性化资源请求为每一个请求建立一个新实例,而不是全部请求共享同一个实例。
二. 标记扩展
1. x:Type
通常状况下咱们操做的是数据类型的实例或者引用,可是有时候须要使用x:Type来操做数据类型自己。
<Style TargetType="{x:Type TextBlock}"> <Setter Property="FontFamily" Value="Segoe Black" /> <Setter Property="HorizontalAlignment" Value="Center" /> <Setter Property="FontSize" Value="12pt" /> <Setter Property="Foreground" Value="#777777" /> </Style>
上面这个例子就是操做TextBlock控件,并设置他的样式。
2. x:Null
在C#代码中,咱们使用null来表示空值,可是在XAML中使用x:Null.
好比上面一段示例代码定义了TextBlock的样子,咱们还能够在代码里面设置它,让他为空来覆盖这个样式资源。
<TextBlock Style="{x:Null}">OK</TextBlock>
3. x:Array
它的做用就是经过它的Items(只读)属性,向使用者暴露一个类型已知的ArrayList实例,ArrayList内成员类型由Type属性指明。
<ListBox Margin="5"> <ListBox.ItemsSource> <x:Array Type="system:String"> <system:String>A</system:String> <system:String>B</system:String> </x:Array> </ListBox.ItemsSource> </ListBox>
咱们不能设置ItemsSource="{x:Array Type=system:String,Items=xxxx},由于Items是一个只读属性。
上面的例子,咱们就是使用属性元素的方式来声明的。在解析的时候,会调用ArrayExtension源代码中的AddChild方法,把A,B添加到Items里。
4. x:Static
它的做用是访问一个static类型的属性或者字段。
三. XAML指令元素
只有x:Code、x:XData
前面已经讲过x:Code,咱们来看看x:XData。WPF中巴包含数据源的对象称为数据源,用于把数据源中的数据提供给使用者的对象称为数据提供者。WPF类库中包含许多数据提供者,其中一个是XmlDataProvider,专门用于提供XML化的数据。咱们经过一个例子就明白了:
<Window.Resources> <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books"> <x:XData> <Inventory xmlns=""> <Books> <Book ISBN="0-7356-0562-9" Stock="in" Number="9"> <Title>XML in Action</Title> <Summary>XML Web Technology</Summary> </Book> <Book ISBN="0-7356-1370-2" Stock="in" Number="8"> <Title>Programming Microsoft Windows With C#</Title> <Summary>C# Programming using the .NET Framework</Summary> </Book> <Book ISBN="0-7356-1288-9" Stock="out" Number="7"> <Title>Inside C#</Title> <Summary>C# Language Programming</Summary> </Book> <Book ISBN="0-7356-1377-X" Stock="in" Number="5"> <Title>Introducing Microsoft .NET</Title> <Summary>Overview of .NET Technology</Summary> </Book> <Book ISBN="0-7356-1448-2" Stock="out" Number="4"> <Title>Microsoft C# Language Specifications</Title> <Summary>The C# language definition</Summary> </Book> </Books> <CDs> <CD Stock="in" Number="3"> <Title>Classical Collection</Title> <Summary>Classical Music</Summary> </CD> <CD Stock="out" Number="9"> <Title>Jazz Collection</Title> <Summary>Jazz Music</Summary> </CD> </CDs> </Inventory> </x:XData> </XmlDataProvider> </Window.Resources> <StackPanel> <ListBox Width="500" Height="300" Background="Honeydew"> <ListBox.ItemsSource> <Binding Source="{StaticResource InventoryData}" XPath="*[@Stock='out'] | *[@Number>=8 or @Number=3]"/> </ListBox.ItemsSource> </ListBox> </StackPanel>
咱们在资源中经过x:XData定义了一个XML的数据源,并经过XmlDataProvider提供给使用者ListBox.