WPF5 x命名空间
基本上只要是包含了xaml代码的WPF程序都需要通过语句:
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"来引入http://schemas.microsoft.com/winfx/2006/xaml
这个命名空间。
显然,这个命名空间所包含的类均与解析XAML语言相关,所以也可以成为XAML命名空间。XAML有自己的编译器,XAML语言被编译解析,最终形成IL语言存储在程序集中。在解析xaml语言的过程中,需要告诉编译器xaml代码编译结果应该与哪个C#编译结果合并,使用xaml声明的元素的访问级别等,这些工具都放置于x命名空间中。
x命名空间中的Attribute
1、x:Class
这个Attribute的作用是告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并,使用x:Class时应当遵循:
A、这个Attribute只用于根节点
B、使用x:Class的根节点类型和x:Class的值所指示的类型保持一致
C、x:Class的值所指示的类型在声明时必须使用partial关键字
2、x:ClassModifer
这个Attribute用于告诉XAML编译由标签编译生成的类具有怎样的访问控制级别。(WPF默认是public)
3、x:Name
XAML是一种声明式语言,XAML标签声明的是对象,一个XAML标签会对应一个对象,一般是一个控件类的实例。类是引用类型,在.NET中只能通过引用者来访问实例,当一个实例不再被任何引用者所引用时,就会被当做内存垃圾而被销毁。
常见的引用者是引用变量,但并不唯一,例如:
<TextBox Margin="5"/> <Button Name="btnChild" Click="btnChild_Click">ShowChild</Button>
虽然可以通过Window1.Content-StackPanel-Children[0]-TextBox找到,但毕竟太麻烦。这时就是使用x:Name的地方。
也就是说,x:Name的作用是:1、告诉xaml编译器,当一个标签带有x:Name时,除了为这个标签生成对应实例外还要为这个实例声明一个引用变量,变量名就是x:Name的值。2、将XAML标签所对应对象的Name属性也设为x:Name的值,并把这个值注册到UI树上以方便寻找。
<TextBox x:Name="textBox" Margin="5" Width="120" Height="30"/> ... private void btnXName_Click(object sender, RoutedEventArgs e) { if(string.IsNullOrEmpty(textBox.Name)) { textBox.Text = "No name"; } else { textBox.Text = textBox.Name; } }
对于应该实用Name还是x:Name,Name属性定义在FrameworkElement类中,这个类是WPF控件的基类,所有的WPF控件都有Name这个属性,当一个元素有Name属性时,实用Name或x:Name都是一样的。因为此时Name和x:Name的值都一样,只是不能同时出现在一个元素中。但对于那些没有Name属性的元素,就只能实用x:Name,因为x:Name涵盖了Name的全部功能,所以全部使用x:Name就可以增强代码统一性和可读性。
4、x:FieldModifier
使用了x:Name后,XAML标签对应的实例就有了自己的引用变量,而且这些引用变量都是类的字段,那么久拥有了访问级别,默认情况下,字段的访问级别和C#一样被设置为了interna(程序集内部可访问),如果需要从一个程序集访问另一个程序集中窗体的元素,就必须修改为public。
例如:
<TextBox x:Name="textBox" Margin="5" Width="120" Height="30" x:FieldModifier="public"/>
5、x:key
最自然的检索方式就是键值对,在xaml文件中,可以把多次需要使用的内容提取出来放在资源字典中,需要使用的时候就用它的key检索出来。WPF中几乎每个元素都有自己的Resources属性,这个属性就是key-value式集合,只要把元素放进这个集合,这个元素就成为资源字典中的一个条目,为了能检索这个条件,就必须为他添加x:Key。
例如:
<Window.Resources> <local:Human x:Key="human" Name="JingYe"/> <sys:String x:Key="myStr">Hello WPF Resource</sys:String> </Window.Resources> ... xmlns:local="clr-namespace:WPF_XAML_1" xmlns:sys="clr-namespace:System;assembly=mscorlib" ... <TextBox x:Name="textBox" Text="{StaticResource ResourceKey=myStr}" Margin="5" Width="120" Height="30" x:FieldModifier="public"/>
现在资源字典中添加一个条目,这个条目是一个字符串,然后把这个字符串的x:Key设置为myStr,然后为了能在xaml中使用String类,使用xmlns:sys引用System命名空间,编译器会自动补齐,<TextBox>标签的Text属性就可以使用{StaticResource ResourceKey=myStr}来调用myStr这个资源。
C#也可以使用这个资源。
MessageBox.Show(this.FindResource("myStr") as string);
6、x:Shared
在使用x:Key时,默认情况下,编译器会为资源隐藏添加一个x:Shared="true",标识所有检索这个对象所得到的都是同一个对象,如果为false,则每次检索都是一个新副本。