在wpf中,XAML都默认引用了一个名称空间

  1. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

把这个名称空间映射成了x,所以x名称空间就是指的这个
这个名称空间包含的类都与解析XAML相关,所以也可以叫“XAML名称空间”

x名称空间的Attribute

Attribute 与 Property是两个层面的东西。Attribute是语言层面的东西、是给编译器看的,Property是面向对象层面的东西、是给编程逻辑用的。
而且一个XAML标签的Attribute里大部分都对应着对象的Property。在使用XAML编程的时候,如果要加上一些特殊的标记从而影响XAML编译器对它的解析,这时候就需要额外为它添加一些Attribute了。比如,你想告诉XAML编译器将编译结果与哪个C#编译的类合并,这时候就必须为这个标签添加x:Class=”目标类名”这样一个Attribute以告知XAML编译器。x:Class 这个 Attribute并不是对象的成员,而是我们把它从x名称空间里拿出来硬贴上去的。

x:Class

编译后的XAML要被编译成C#的形式,整个窗体应该是一个类,这个类里面包含了UI页面代码,各种属性,颜色啊,字体啊,大小啊。还有各种事件,点击事件,键盘事件,各种逻辑等。
关于事件,逻辑方面的是我们自己写的代码,写在在窗体的后置代码.xaml.cs文件里面,而复杂繁琐的UI是由XAML编译生成的。同一个类里面的东西,本来应该放在一起的,就用部分类。UI单独放,逻辑单独放。
但是UI和逻辑都在一个类里面,而x:Class就是指定生成的UI代码是哪个类的另一部分类,要和哪个类合并,要合并的类,通常就是窗体的后置代码.xmal.cs里面的那个类。

要注意力以下几点:

  • 只能用来根节点,Window节点
  • 使用时,声明要合并的类必须是部分类,也就是用了关键字partial

x:ClassModifier

这个Attribute的作用是告诉XAML编译由标签编译生成的类具有怎样的访问控制级别。

注意以下几点:

  • 要使用这个属性,标签必须要同时使用x:Class属性
  • x: ClassModifier的值必须与x:Class 所指示类的访问控制级别一致

x:Name

XAML是一种声明式语言,但是声明的是什么?XAML声明的每一个标签控件元素,都是一个对象。一个XAML标签对应着一个对象,这个对象一般是C#中一个控件类的实例。

XAML 这种对象声明语言只负责声明对象而不负责为这些对象声明引用变量。如果我们需要为对象准备一个引用变量以便在C#代码中直接访问就必须显式地告诉XAML编译器——为这个对象声明引用变量,这时x:Name就派上用场了。
就是给控件取个名字,使用控件的时候直接调用这个名字,就能拿到这个控件对象了,和winform的名字一样的。

  1. <TextBox Width="100" Height="30" Text="哈哈哈" x:Name="abcinput"></TextBox>

image.png
Name和x:Name的区别

wpf中所有的控件几乎都有Name属性,这时候x:Name和Name一样的。 如果没有Name属性,就可以用x:Name给这个标签加一个引用变量,加了就可以像上面那样用名字就可以获取调用了。 总之x:Name包含了Name,统一用x:Name就好

x:FieldModifier

用来设置标签对象的访问级别,上面的Name设置了,可以直接在后置代码里面调用这个控件对象,这是基于同一个程序集,这个控件对象的访问级别默认是internal。如果要炸其他程序集访问这个控件,就访问不到。可以通过x:FieldModifier来设置该控件的访问级别为public等

  1. <TextBox Width="100" Height="30" Text="哈哈哈" x:Name="abcinput" x:FieldModifier="public"></TextBox>

注意用x:FieldModifier的同时要用Name或者x:Name

x:Key

键值对的key,更多时候,会重复的使用一些资源,如样式,模板,动画等。我们可以把需要多次使用的资源提出来放在资源字典里面,在需要使用这个资源的时候,用它的key把他检索出来。
x:Key的作用就是为资源贴上用于检索的索引,在wpf中几乎每个元素都有自己的Resources属性,这个属性是key-value式的集合。

调用资源的时候用一个花括号,左花括号写StaticResource 空一格,然后写上定义资源时用的x:Key的值,就能引用这个资源了

  1. <Window x:Class="WpfApp1.MainWindowA"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:sys="clr-namespace:System;assembly=mscorlib"
  7. xmlns:local="clr-namespace:WpfApp1"
  8. mc:Ignorable="d"
  9. Title="MainWindow" Height="450" Width="800">
  10. <Window.Resources>
  11. <sys:String x:Key="str">这是放在资源字典里面的一个字符串</sys:String>
  12. </Window.Resources>
  13. <Grid>
  14. <TextBox Width="200" Height="30" Text="{StaticResource str}" x:Name="abcinput" x:FieldModifier="public"></TextBox>
  15. </Grid>
  16. </Window>

image.png
同样的C#代码里面也能访问资源字典的内容
image.png

x:Shared

一旦我们把某些对象当作资源放进资源字典里后,就可以用x:Key把它们检索出来重复使用。那么,每当它们检索到一个对象时,我们得到的究竟是同一个对象呢,还是这个对象的多个副本呢?这就要看我们给x:Shared赋什么值了。

x:Shared一定要与x:Key配合使用,如果x:Shared 的值为 true,那么每次检索到这个对象时,我们得到的都是同一个对象,否则如果x:Shared 的值为false,每次我们检索到这个对象时,我们得到的都是这个对象的一个新副本。XAML编译器会为资源隐藏地添加x:Shared=”true”,也就是说,默认情况下我们得到的都是同一个对象。