WPF基础篇

时间:2022-05-26 02:08:54

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

在x名称空间下包含三种类型的工具:

一、Attribute类型的工具

二、标签扩展类型的工具

三、XAML指令元素类型的工具

我们可以看到,他们分为Attribute,标记扩展和XAML指令元素三类。

Attribute

Attribute是语言层面的东西,是给XAML编译器看的,Property是面向对象层面的东西,是给编程逻辑用的。在使用XAML编程的时候,如果你想给他加上一些特殊的标记从而影响XAML编译器对他的解析,那么就要对他添加一些Attribute。

常用的一些Attribute

x:Class

这个Attribute主要告诉XAML编译器,编译的XAML将和哪一个类合并。

使用x:Class要注意:这个Attribute只能用于根节点,指向的类必须使用关键字partial

x:ClassModifier

这个Attribute主要告诉XAML编译器,有标签编译生成的类具有怎样的访问控制级别。

x:Name

这个就如winform中的ID一样

x:FieldModifier

这个就是用来在XAML里改变引用变量访问级别的

x:Key

最自然的检索方式莫过于使用"Key-Value"对的形式了。在XAML文件中,我们可以把很多需要多次使用的内容提取出来放在资源字典中,需要用到的时候就用这个Key把它检索出来。

x:Shared

在学习使用x:key时我们已经知道,一旦我们把某些对象当做资源放进资源字典里后就可以把他们检索出来重复使用,那么,每当他们检索到一个对象时,我们得到的究竟是同一个对象呢,还是这个对象的多个副本?这就要看x:Shared怎么设置了,默认为true,我们得到的是同一个对象。如果是false,那么我们得到的是这个对象的一个新副本。

标记扩展

x:Type

顾名思义,x:Type的值是一个数据类型的名称。编程中也会用到数据类型本身。

x:Null

在c#语言里,我们用null关键字来表示空值,在XAML里我们就用x:Null来表示空值。

x:Array

x:Array的作用就是通过它的Items属性向使用者暴露一个类型已知的ArrayList实例,ArrayList的成员类型由x:Array的Type指明。

x:Static

在XAML文档中使用数据类型的static成员

指令元素

x:Code

x:Code可以将逻辑代码放到XAML中运行

x:XData

那就是数据源了,在该标签内的内容可以作为数据源使用

这就是x空间里所有的东西了

下面我们就分别介绍一下吧!

一、x名称空间中的Attribue

提到Attribute,不由的想起我学习编程的时候,属性这个概念,在英文的技术文章中存在Attribute和Property这两个概念,用中文翻译都可以译为“属性”。既然都为“属性”那么它们之间有什么区别呢?通过查阅资料,有这样的解释:Attribute和Property是两个层面的东西,Attribute是语言层面上的东西,是给编译器看的,而Property是面向对象层面上的东西,是给编程逻辑用的。对于两者更贴切的翻译应该是Atrribute被译为“特征”,而Property被译为属性。好了,我们还是来看看x名称空间中的Attribute。

1、x:Class 这个Attribute的作用是告诉XAML编译器将XMAL标签的编译结果与后台代码中指定的类合并。使用该Attribute必须遵循一些要求:

          该Atrribute只能用于xaml的根节点中

          使用x:Class的根节点的类型要与x:Class的值所指示的类型保持一致

          x:Class的值所指示的类型在声明时必须使用partial关键字

示例代码如下:

前台的xaml代码:

<Window x:Class="WpfApplication3.Window9"
        xmlns=""
        xmlns:x=""
        Title="Window9">

...........................................................

后台的cs代码:

public partial class Window9 : Window
    {
        public Window9()
        {
            InitializeComponent();
            List<Student> students = new List<Student>(){
                new Student(){Id=1,Name="Tim",Age=21},
                new Student(){Id=2,Name="Tom",Age=22},
                new Student(){Id=3,Name="Jim",Age=23}
            };

this.listBox1.ItemsSource = students;
            //this.listBox1.DisplayMemberPath = "Name";