x命名空间详解

很多书本,博客等对x命名空间详解介绍不是很详细,而且例子也不多,这里就为大家好好介绍一把,XAML2009 主要新功能也介绍一下,不正确之处还请指正。


x命名空间映射的是http://schemas.microsoft.com/winfx/2006/xaml,可以猜测,它包含的类应该与解析XAML语言有关,也称为XAML命名空间。

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


1. x命名空间中的Attribute

1.1 x:Class

作用:告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并。
注意点:
  • 该Attribute只能用于根节点。
  • 使用x:Class的根节点的类型要与x:Class的值所指示的类型保持一致。
  • x:Class的值所指示的类型在声明时必须使用partial关键字。

1.2 x:ClassModifier

作用:告诉XAML编译由标签编译生成的类具有怎样的访问控制级别。默认值为public,假如x:Class中所对应的后台代码中的类为internal修饰,则需要使用此Attribute。
.NET 框架 XAML 服务使用中 x:ClassModifier 的值中随不同的编程语言而不同。 C#中, TypeAttributes.Public 和 TypeAttributes.NotPublic 对应public和internal。

1.3 x:Subclass

作用:在同时提供了 x:Class 的情况下,修改 XAML 标记编译行为。不必根据 x:Class 类创建分部类,而是将提供的 x:Class 创建为中间类,然后提供的派生类应基于 x:Class。
x:Subclass 用法主要针对不支持分部类声明的语言。
使用例子:
<Window x:Class="WpfApplication2.MainWindow"
		x:Subclass="WpfApplication2.MainWindowSub"
		xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
		xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		x:ClassModifier="internal"
		Title="MainWindow" Height="350" Width="525">
	<Grid>
		<Label x:Name="lbl" Content="123" />
	</Grid>
</Window>
后台代码:
namespace WpfApplication2
{
	internal class MainWindowSub : WpfApplication2.MainWindow
	{
		public MainWindowSub()
			: base()
		{
			InitializeComponent();

			lbl.Content = "321";
		}
	}
}

1.4 x:Name

作用:
a. 告诉XAML编译器,当一个标签带有 x:Name 时除了为这个标签生成对应实例外还要为这个实例声明一个引用变量,变量名就是 x:Name 的值。 
b. 将XAML标签所对应对象的Name属性(如果有)也设为x:Name的值,并把这个值注册到UI树上,以便查找。
执行 InitializeComponent 使通过 x:Name /字段名称直接而非必须显式地调用FindName 在任何需要引用 XAML 定义对象的时候可以引用运行时对象图。

x:Name和Name

许多 WPF 应用程序方案都可以完全避免使用 x:Name 特性,因为在默认 XAML 命名空间内为几个重要基类(如 FrameworkElement 和 FrameworkContentElement)指定的 Name 依赖项属性也具有此用途。 当代码在框架级访问具有非 Name 属性的元素时,仍存在一些常见的 XAML 和 WPF 方案。 例如,某些动画和演示图板支持类不支持 Name 属性,但为了控制动画经常需要引用代码。 应当在时间线以及在 XAML 中创建的变换上将 x:Name 指定为属性,前提是您计划以后在代码中引用它们。

1.5 x:FieldModifier

作用:修改 XAML 编译行为。XAML中声明类或其成员的常规访问级别为internal,如需修改为public,需要设置此值。
因为x:FieldModifier是用来改变引用变量访问级别的,所以使用x:FieldModifier的前提是这个标签同时也使用x:Name,不然怎么引用呢?
测试:
<StackPanel>
	<Label x:Name="lbl" Content="123" />
	<Label x:Name="lbl2" x:FieldModifier="public" />
</StackPanel>
效果: 其他 dll 访问时,仅能访问 lbl2

1.6 x:Key

作用:资源中用于检索的索引。(Key-Value模式)
在 XAML 2006 和 WPF 中,必须以特性形式提供 x:Key。 您仍可以使用非字符串键,但这需要标记扩展用法来提供特性窗体中的非字符串值。 如果使用 XAML 2009,则 x:Key 可以被指定为显式支持以对象类型而不是字符串为键的词典而不需要标记扩展中间语言。
注意:在 WPF 中,可以使用 XAML 2009 功能,但仅针对未进行标记编译的 XAML。 WPF 的已编译标记的 XAML 以及 XAML 的 BAML 形式当前不支持 XAML 2009 关键字和功能。
下面用XamlReader来实现XAML2009功能:
string strXaml = "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"" +
	" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"> "+
	" <Label Content=\"XAML2009\">"+
	"		<x:Key>"+
	"			<x:String>xaml2009</x:String>"+
	"		</x:Key>"+
	" </Label>"+
	"</ResourceDictionary>";
StringReader strreader = new StringReader(strXaml);
XmlTextReader xmlreader = new XmlTextReader(strreader);
object obj = XamlReader.Load(xmlreader);
this.Resources.MergedDictionaries.Add((ResourceDictionary)obj);
XAML中引用:
<Label x:Name="lbl" Content="{DynamicResource xaml2009}" />

1.7 x:Shared

作用:当设置为 false 时,会修改 WPF 资源检索行为,以便特性化资源请求为每个请求创建一个新实例,而不是所有请求共享同一个实例。默认值为true。
举例:在x:Shared="true"情况下,在多个元素引用某一资源时,如果某一个元素更改了该资源,则其他元素也会跟着修改。
资源:
<SolidColorBrush x:Key="color" x:Shared="true"  Color="Red"/>
<SolidColorBrush x:Key="bcolor" x:Shared="false"  Color="Gray"/>
引用:
<Label Content="x:Shared" Foreground="{DynamicResource color}" Background="{DynamicResource bcolor}"/>
<Label x:Name="lblShared" Content="x:Shared" Foreground="{DynamicResource color}" Background="{DynamicResource bcolor}"/>
<Button x:Name="btn" Content="更改颜色" Click="btn_Click"/>
按钮代码:
internal override void btn_Click(object sender, RoutedEventArgs e)
{
	//更改Foreground
	SolidColorBrush brush = this.lblShared.Foreground as SolidColorBrush;
	brush.Color = Colors.Blue;

	//更改Background
	brush = this.lblShared.Background as SolidColorBrush;
	brush.Color = Colors.Yellow;
}
效果:
点击按钮后

1.8 x:Uid

作用:标记元素提供唯一的标识符。 在许多情况下,此唯一标识符由 XAML 本地化过程和工具使用。
详细介绍将在WPF全球化中进行。

2. x命名空间中的标记扩展

2.1 x:Type

作用:提供 CLR Type 对象,该对象是指定的 XAML 类型的基础类型。
在样式、模板等中指定TargetType或者数据绑定中使用RelativeSource的FindAncestor模式都会用到x:Type。

2.2 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}"/>
效果(看下拉框):

2.3 x:Null

作用:将 null 指定为 XAML 成员的值。
x:Null多用于样式等控制,使某些元素的样式不受通用颜色控制等。

2.4 x:Array

作用:通过它的Items属性向使用者暴露一个类型已知的ArrayList实例,ArrayList内成员的类型由x:Array的Type指明。
使用代码示例如下:
<ComboBox>
	<ComboBox.ItemsSource>
		<x:Array Type="sys:String">
			<sys:String>XMAL2006</sys:String>
		</x:Array>
	</ComboBox.ItemsSource>
</ComboBox>

2.5 x:Static

作用:在XAML文档中使用数据类型为static的成员(包括常量、静态属性、字段或枚举值)。
定义静态字段:
public static string strStatic = "我是静态字段";
引用:
<Label Content="{x:Static local:MainWindowSub.strStatic}"/>

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}"/>
效果:


3. XAML指令元素

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>

3.2 x:Xdata

作用:x:XData标签是一个专用标签。WPF中把包含数据的对象称为数据源,用于把数据源中的数据提供给数据使用者的对象被称为数据提供者(Data Provider)。WPF类库中包含多种数据提供者,其中有一个类叫XmlDataProvider,专门用于提供XML化的数据。如果想在XAML里声明一个带有数据的XmlDataProvider实例,那么XmlDataProvider实例的数据就要放在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>
效果:


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


作者:FoolRabbit
出处:http://blog.csdn.net/rabbitsoft_1987
欢迎任何形式的转载,未经作者同意,请保留此段声明!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FoolRabbit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值