WPF初学总结

先搜集几个好的wpf博客,有空常看:

http://www.cnblogs.com/lzhp/tag/WPF%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA/  (WPF深入浅出)

 

XAML综述:

关于XAML需要记住一些重要事项如下:

         一个XAML树由带有一个根元素的正确嵌套的各种元素组成。

         在这种树中每个元素都代表一个.NET对象。其元素总是某一个.NET类名。

         每个元素可以包含对各种特性的赋值。

                  一个特性对应这个元素代表的那个.NET对象的一个属性。

                 无论这个属性的类型如何,特性的值总是一个字符串string。XAML解析器自动对这个string进行转换成适当的类型的值。

        XAML语法包含4中类型的结构:

                对象元素语法:这种结构由指定树的各种元素的标签组成。它还包含在元素开始标签中的各种特性。

                属性元素语法:一些类型的某些属性太复杂而不能通过一个纯string设定。这些情况下,你可以使用在一个元素的内容部分嵌套各种属性元素标签的集合的属性元素语法。要注意属性元素中不能含有特性。

               附加属性语法:这种结构能让你附加一个不同.NET对象的属性到这个元素。暂无过多描述。

               标记扩展:这类结构能让.NET对象执行运行时的行为以指定一个值到一个的行为。标记扩展是一个勾向XAML外部的类的钩子,那个外部的类被称为扩展类。【一般只能用在特性赋值上面,以键值对形式出现。通常以大括号的形式出现,常用在如Binding绑定和Resource资源使用以及Style样式设定时】

 

主要难点总结如下:

首先说明一下,WPF中控件主要包括两类:内容控件ContentControl和项目控件ItemsControl,内容属性默认分别对应Content属性和Items属性。还有两种的混合控件就不多叙述了。

下面简单说一下布局:

在布局中常常使用控件的HorizontalAlignment属性和VerticalAlignment属性。它们决定了控件摆放在容器中的“卡槽”的那篇区域。如下图:

【另外,对于控件的margin属性,是在这个控件先在一个卡槽内,然后距这个卡槽四周多远距离,如果不设margin属性,也不设置控件的大小,默认情况下控件是填满整个卡槽的。而且margin如果设置为5,且控件的大小设置好,控件又在卡槽的中心,此时空间方圆5单位外可能是空白,并不一定要有东西,如上图的Certer按钮,可以这样理解margin为5表示此控件方圆大于或等于5单位范围可能有其他控件,“小于5单位范围一定是空隙”,就想象成一个带一圈空隙的控件该摆哪还摆哪。】

 

一、依赖项属性

【先说明一下依赖项属性并没有在XAML中有对应的写法或语法来体现,即并不能直接用在XAML代码中,要定义的话必须在后台代码中定义一个常规的依赖项属性。后面讲到的如附加属性就是一种特殊的依赖项属性(准确的说法是附近属性使用了依赖项属性机制)还有样式Style也隐式的使用依赖项属性,他们在XAML代码中有简单的书写体现,但实际上是通过自动调用依赖项属性的东西运行的。所以说道依赖项属性并不是和附近属性一样在XAML中体现的语法样式,而是一种机制,XAML语法中很多语法形式之所以书写简单但功能强大就是背后隐式的自动调用了依赖项属性的机制。所以讨论XAML语法时并没有包含依赖项属性。】

依赖属性就是可以自己没有值,并能够通过Binding从数据源获取值(依赖在别人身上)的属性。拥有依赖属性的对象被称为“依赖对象”。与传统的CLR属性和面向对象相比依赖属性有很多新颖之处,其中包括:

  •         节省实例对内存的开销。
  •         属性值可以通过Binding依赖在其它对象上。

依赖属性较之CLR属性在内存使用方面迥然不同。前面已经说过,实例的CLR属性都包装着一个非静态的字段(或者说由一个非静态的字段在后台支持)。思考这样一个问题:TextBox有138个属性,假设每个CLR属性都包装着一个4字节的字段,如果程序运行的时候创建了一个10列1000行的的一个TextBox列表,那么这些字段将暂用4*138*10*100=5.26M内存!在这100多个属性里面,最常用的也就Text属性,这就是说大多数内存会被浪费掉。

怎么避免这种浪费呢?让我们去思考一个现实世界中存在的问题:一个登山队员,他的全套装备有很多,包括登山服、登山靴、登山仗、护目镜、绳索、无线电、水、食品甚至还有氧气瓶等。倘若是去等珠穆朗玛峰,这些装备都要带上,要是去登香山呢?如果也背着氧气瓶岂不怪哉!所以,实际的一点办法就是---用得着的就带上,用不着的就不带,有必要的时候可以借别人的用一下。

其实,这就是WPF中依赖属性的原理。传统的.NET开发中,一个对象所暂用的内存空间在调用New操作符进行实例化的时候就已经决定了,而WPF允许对象在被创建的时候并不包含用于存储数据的空间(即字段所占用的空间)、只保留在需要用到数据的时候能够获得默认值。借用其它对象的数据或者实时分配空间的能力----这种对象称为依赖对象而他这种实时获取数据的能力则依靠依赖属性来实现。在WPF开发中,必须使用依赖对象作为依赖属性的宿主,使二者结合起来,才能形成完整的Binding目标被数据所驱动。

如下图:

 从上图可以看出以来项属性实际上【内存空间】被WPF属性系统内部所持有。需要一个DependencyProperty(依赖项属性标识符,元数据)实例和一个DependedcyObject实例共同指向WPF属性系统内部那个唯一的依赖项属性。【从外部整体上看也可以认为依赖项属性由依赖项属性标识符实例和依赖项对象实例构成】

在WPF系统中,依赖对象的概念被DependencyObject类所实现。依赖属性的概念则由DependencyProperty来实现。DependencyObject具有public object GetValue(Depend

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值