WPF笔记一 关于XAML

WPF笔记一 关于XAML


一 XAML的起源与实现特点

1.1 XAML的起源

XAML来自于XML的变体,主要是为了实现WPF中的界面展示层而设计的变体(或者说,XAML是WPF中专门用来设计UI的)。XAML中只包含申明性的语言,无法加入逻辑代码(实际上,这就强制要求逻辑和UI分离)。为什么XMAL能够实现逻辑与UI的分离呢?

  • 借助C#的partial类,UI与逻辑代码实现类的分开设计,统一合并。实际上,XAML最后是被XAML解析器解析为一个类以及一系列的对象的定义与赋值。
  • 1.2 XAML的attribute

    XAML的基本构成是一系列的标签以及标签的attribute。attribute与property是有区别的。

  • property是相对于对象来说,对象的一系列属性。比如抽象出人的类,属性指人的身高,性别,年龄等。
  • 尽管很多attribute最后还是赋值给了对象的属性(比如button的width,height,background等特征)。这不意味着,attribute与property是一样的东西,很简单的例子是attribute有x:class,告诉XMAL解析器,如何去合并类,有x:ClassModifier,告诉XAML解析器,由标签生成的类具有怎样的控制级别。
  • 1.3 XAML的名称空间

    所谓名称空间,指的是一串的网址一样的东西。这串东西有什么用呢?

  • C#里面要使用.NET的包,或者windows的默认功能,或者第三方的控件。起流程大致是:添加包到项目的引用(.NET以及windows的一些默认包已经自动引用),使用using语句引用类库,使用类的对象实例。
  • 在XAML里面,同样要添加引用类库到项目引用,然后不是使用using,而是使用xmlns(xml namespace的简写)代替using语句,然后就可以使用对象实例(比如button,windows,grid等对象实例)。
  • ` xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"`
    

    它所对应的就是引入了两个基本的名称空间(类库), 第一个名称空间代表WPF的展示类库,包括windows,button,stackpanel等各种UI元素。第二个名称空间代表引入XAML编译器类库,由此可以争取的解析XAML。为什么一定像http网址呢?
    至于xmlns:x指的是一个缩写而已。


    二 XAML的结构

    2.1 元素树

    XAML实质是一堆标签的集合(也可以称为UI元素),开始标签与结束标签之间表示的是标签的内容(对应标签有content属性,默认在开始与结束之间是为content赋值)。这样子组成了一颗元素树结构。标签的内容可以是子元素,也称为子控件。
    标签的子元素,实质上是对父元素的一系列属性的赋值,子元素是对父元素的content或者children或者items属性赋值罢了。所以其实在开始与结束标签之间还可以对父元素的某些属性对象赋值!

    2.2 可扩展标记类

    实际上就是继承了可扩展的接口,然后在需要生成一个新对象实例的时候,可以用一个特殊的语法代替:

    <Grid>
    <Grid.Resources>
    <Image x:Key="haoba"></Image>
    <Image x:Key="good"></Image>
    </Grid.Resources>
    <TextBox Margin="5,10,50,10">haoba</TextBox>
    <TextBox Margin="10,46,91,10">meishi</TextBox>
    <ListBox ItemsSource="{Binding Source=DCMData, Path=name, Mode=OneWay}"></ListBox>
    </Grid>

    其中的itemsSource就是用了扩展标记类,其实质是:
    Binding myBinding = new Binding() { Source = DCMData, Path = "Name", Mode = BindingMode.OneWay };
    值得注意的是:

  • 想要使用可扩展标记特性,类必须要实现了可扩展标记接口,在XAML并不是所有的类都实现了可扩展标记接口。
  • 2.3 关于x名称空间的使用

    x名称空间来自于:
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    代表的是XAML的编译器类
    其特性有如下:

  • 使用x:FieldModifier 特征来指定当前UI元素的访问属性,主要是指其他XAML的引用权限
  • 使用x:Name特征来为对象申明引用变量名,什么意思呢?前面,我们申明textbox,并没有指定名字,要访问textbox只能通过windows->grid->textbox的层级关系。我们可以使用x:Name直接给他一个名字,这样在cs文件中就不用层级寻找,直接使用这个指定的名字即可。
    <TextBox Margin="10,46,91,10" x:Name="mytext">meishi</TextBox>

    那么问题来了?textbox不是本身有name特征吗?为甚需要多此一举,使用x:Name来指定呢?因为并不是所有的元素都有Name属性,但是所有的元素都可以用x:Name来指定一个名字,所以全部使用x:Name特征可以增强代码统一性和可读性。
  • 使用x:key来添加资源检索标志,这个特征非常好用,资源(resources)在WPF中非常重要,需要重复使用的XAML内容,如Style,各种Template和等都需要放在资源文件里面。
    为grid添加多个图片资源:
    <Grid.Resources>
    <Image x:Key="haoba"></Image>
    <Image x:Key="good"></Image>
    <sys:String x:Key="str">hello world</sys:String>
    </Grid.Resources>
    <TextBox Margin="5,10,50,10" MouseDoubleClick="TextBox_MouseDoubleClick">haoba</TextBox>
    <TextBox Text="{StaticResource ResourceKey=str}" Margin="10,46,91,10" x:Name="mytext"></TextBox>

  • x:Static属性,如果一个程序需要支持国际化,一般会把需要显示的字符串资源保存在一个资源类的static属性中。所以支持国际化的程序UI中对x:Static的使用非常频繁。使用x:Static指定访问指定类的静态资源。
    <TextBox Text="{x:Static local:App.Current}" Margin="5,10,50,10" MouseDoubleClick="TextBox_MouseDoubleClick"></TextBox>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值