WPF x名称详解
x名称空间由来:
x名称空间里的成员是专门为XAML编译器看的,用来引导XAML编译器把XAML编译成CLR代码,因此x是XAML的首字母。通过x空间的成员告诉编译器怎么编译XAML,生成什么类名,属性的可访问性等。
x名称空间中的Attribute:
x:Class,用来告诉XAML编译器把XAML标签的编译结果与后台代码的哪个类合并,只能用于根节点,并且根节点的类型要与后台代码的类保持一致。
x:ClassModifier,用来告诉XAML编译器把XAML标签编译成的类具有怎样的访问级别,必须具有x:Class Attribute的标签才能应用,并且与指定的后端代码访问级别一致。
x:Name,用来告诉XAML编译器把创建的对象指向到指定的变量名,这样可以直接在代码中引用该对象。如果标签具有Name属性,同时把Name属性赋值为x:Name指定的值。为了增强代码的统一性,全部使用x:Name来指定对象的变量名。
x:FieldModifier,用来告诉XAML编译器由该标签生成的类的字段的访问级别,默认为internal。
x:Key,为资源字典指定key值,在XAML中通过StaticResource标记扩展进行资源检索时使用,并且可以自动向父级元素检索并一直递归直到找到该资源或到达Application。通过在代码中使用.FindResource方法也可以进行递归检索资源。
x:Shared,与x:Key配合使用,用来指定检索资源对象时,是使用同一个对象副本还是不同的对象,默认x:Share=“True”,因此资源检索得到的是同一个对象。
x名称空间中的标记扩展:
x:Type,类型为TypeExtension的标记扩展,用来在XAML中指定Type类型,与C#中的typeof关键字类似。x:Type的默认参数为类型,如{x:Type local:MyWindow}或{x:Type TypeName=local:MyWindow}。
x:TypeArguments 作用:将泛型的约束类型参数传递给泛型类型的构造函数。 x:TypeArguments在XAML2006中的限制:仅有
XAML 文件的根元素可以支持引用泛型类型的泛型 XAML 用法。根元素必须映射到至少具有一个类型参数的泛型类型。 一个示例是
PageFunction<T>。 这些页面函数是用于 WPF 中的 XAML 泛型用法支持的主要方案。用于泛型的根元素 XAML 对象元素必须也使用
x:Class声明一个分部类。 即使定义了 WPF 生成操作,这也为 true。x:TypeArguments 不能引用嵌套的泛型约束。
XAML2009中,可以实例化泛型对象元素,可以支持后备类型系统和对象模型的 XAML 标记中的任何位置处。 XAML2009功能举例: string
strXaml =
"<ResourceDictionary
xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"" + "
xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" " + "
xmlns:scg=\"clr-namespace:System.Collections.Generic;assembly=mscorlib\"> " +
" <scg:List x:Key=\"list\" x:TypeArguments=\"x:String\">" + "
<x:String>XAML2009</x:String>" +
" </scg:List>" +
"</ResourceDictionary>";
StringReader strreader = new StringReader(strXaml); XmlTextReader xmlreader = new XmlTextReader(strreader);
object obj = XamlReader.Load(xmlreader);
this.Resources.MergedDictionaries.Add((ResourceDictionary)obj);引用: <ComboBox
ItemsSource="{DynamicResource list}"/>
效果(看下拉框):
x:Null,类型为NullExtension的标记扩展,用来在XAML中显示为属性指定Null值,如果在资源字典中定义了Style并把key和TargetType都指定为目标类型,则目标类型的所有标签都默认使用该Style。如果控件不想使用默认Style,则可以为Style指定null,如Style={x:Null}。
标记扩展除了使用标准的大括号形式使用,还可以使用属性元素的语法声明,如<Button.Style><x:Null /></Button.Style>,显然这种写法太繁琐,但如果使用x:Array标记扩展,则必须使用这种标签形式语法。
x:Array,类型为ArrayExtension的标记扩展,用来在XAML中声明数组对象,只能使用标签语法,如以下代码片段
<ListBox>
<ListBox.ItemsSource>
<x:Array Type="sys:String">
<sys:String>String1</sys:String>
<sys:String>String2</sys:String>
<sys:String>String3</sys:String>
</x:Array>
</ListBox.ItemsSource>
</ListBox>
x:Static,类型为StaticExtension的标记扩展,用来在XAML中引用类的静态字段或静态属性,如Text={x:Static local:Window1.ShowText}。
2.6 x:Reference(XAML2009) 作用:引用在 XAML 标记中其他地方声明的实例。和{Binding ElementName="..."}的作用类似。个人发现的区别就是x:Reference能使用于非依赖属性。注意:x:Reference 是 XAML 2009 中定义的一个构造。在 WPF 中,可以使用 XAML 2009 功能,但仅针对未进行 WPF 标记编译的 XAML。事实上,x:Reference能在用在进行WPF标记编译的XAML中,带上编译器(VS2013)错误列表会提示“未将对象引用设置到对象的实例。”的错误(因为x:Reference引用的对象在设计的时候还没有实例化),设计界面无效果(如下图),但是能编译成功,运行也是可以的。代码:
<Button x:Name="btnXAML" Content="{}{x:Reference}" Style="{x:Null}" Foreground="Red"/>
<!--x:Reference与{Binding ElementName="..."}的区别:x:Reference可以适用于非依赖属性--> <!--使用--> <Label
Content="Binding ElementName="..."" Foreground="{Binding
ElementName=btnXAML,Path=Foreground}"/> <Label Content="使用x:Reference"
Foreground="{Binding Source={x:Reference btnXAML},Path=Foreground}"/>效果:
XAML指令元素:
XAML指令元素只有两个,x:Code和x:XData,x:Code用来把C#代码放到XAML中,x:XData用来为数据提供者提供数据,如以下代码片段
<XmlDataProvider x:Key="InventoryData" XPath="Inventory/students"> <x:XData> <Inventory xmlns=""> <students> <Student age="18"> <id>01</id> <name>小丽</name> </Student> <Student age="17"> <id>02</id> <name>小明</name> </Student> </students> </Inventory> </x:XData> </XmlDataProvider> 使用资源: <DataGrid AutoGenerateColumns="False"> <DataGrid.ItemsSource> <Binding Source="{StaticResource InventoryData}" XPath="*[@age>=18] "/> </DataGrid.ItemsSource> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding XPath=id}" Header="代码"/> <DataGridTextColumn Binding="{Binding XPath=name}" Header="名称"/> </DataGrid.Columns> </DataGrid>
<Page.Resources>
<XmlDataProvider x:Key="asdf">
<x:XData>
<Root>
<Item>Item1</Item>
<Item>Item2</Item>
</Root>
</x:XData>
</XmlDataProvider>
</Page.Resources>
3.1 x:Code 作用:允许在 XAML 生产内放置代码。示例:
<Window x:Class="WpfApplication2.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <StackPanel> <Button Content="内置代码" Click="codeinside"/> </StackPanel> <x:Code> <![CDATA[ private void codeinside(object sender, System.Windows.RoutedEventArgs e) { MessageBox.Show("内置代码测试"); } ]]> </x:Code> </Window>
4. XAML2009 中的语言基元在上面的介绍XAML2009其他功能的时候已经使用到,这里不在举例。
4.1 x:Object 对于 CLR 支持,x:Object 基元对应于 Object。
4.2 x:Boolean 对于 CLR 支持,x:Boolean 基元对应于 Boolean。 XAML 分析 x:Boolean 的值时不区分大小写。 请注意 x:Bool 不是可接受的备选基元。
4.3 x:Char 对于 CLR 支持,x:Char 基元对应于Char。
4.4 x:String 对于 CLR 支持,x:String 基元对应于 String。
4.5 x:Decimal 对于 CLR支持,x:Decimal 基元对应于 Decimal。
4.6 x:Single 对于 CLR 支持,x:Single 基元对应于Single。除了数值之外,x:Single 的文本语法还允许使用标记 Infinity、-Infinity 和 NaN。 这些标记视为区分大小写。
x:Single 支持采用科学记数法格式的值,条件是文本语法中的第一个字符为 e 或 E。
4.7 x:Double 对于 CLR 支持,x:Double基元对应于 Double。除了数值之外,x:Double 的文本语法还允许使用标记 Infinity、-Infinity 和 NaN。 这些标记视为区分大小写。
x:Double 支持采用科学记数法格式的值,条件是文本语法中的第一个字符为 e 或 E。
4.8 x:Int16 对于 CLR 支持,x:Int16基元对应于 Int16,并且 x:Int16 视为带符号。 在 XAML 中,文本语法中没有加号 (+) 表示是一个带符号的正值。
4.9 x:Int32 对于CLR 支持,x:Int32 基元对应于 Int32。 x:Int32 视为带符号。 在 XAML 中,文本语法中没有加号 (+) 表示是一个带符号的正值。
4.10 x:Int64 对于 CLR 支持,x:Int64 基元对应于 Int64。 x:Int64 视为带符号。 在 XAML 中,文本语法中没有加号
(+) 表示是一个带符号的正值。
4.11 x:TimeSpan 对于 CLR 支持,x:TimeSpan 基元对应于 TimeSpan。请注意,时间日期格式的XAML 分析本质上在 en-US 区域性设置下进行。
4.12 x:Uri 对于 CLR 支持,x:Uri 基元对应于 Uri。检查协议不是 x:Uri 的XAML 定义的一部分。
4.13 x:Byte 对于 CLR 支持,x:Byte 基元对应于 Byte。 Byte / x:Byte 视为无符号。
4.14 x:Array 对于 CLR 支持,x:Array 基元对应于 Array。可以在 XAML 2006 中使用标记扩展语法定义一个数组;而 XAML 2009
语法是语言定义的基元,不需要访问标记扩展。
5. 其他还有一些WPF中很少用的这里就不做介绍了。
x:Members,x:Member,x:Property等在WF中使用较多。还有xml:lang,xml:space。
XAML2009中的新指令:x:Arguments,x:FactoryMethod 另外使用一对大括号({})进行转义在WPF基础知识中已经介绍。注意:在
WPF 中,可以使用 XAML 2009 功能,但仅针对未进行 WPF 标记编译的 XAML。 标记编译的 XAML 以及BAML 形式的 XAML 当前不支持
XAML 2009 关键字和功能。而x:Reference是个例外,其他的新特征在测试时都是通过XamlReader进行的


浙公网安备 33010602011771号