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进行的

 

posted @ 2017-03-28 16:23  高_山_流_水  阅读(665)  评论(0)    收藏  举报