WPF的几个关键点

强大的组合能力

WPF的UI元素可以很灵活的相互嵌套,从而可以实现很复杂的效果。比如,一个Button内部,可以嵌入Image,这样实现常见的位图按钮就很简单。

<Button>
    <Image Source="btn.jpg">
</Button>

还可以使用Layout元素,对内部的对象进一步进行排列

<Button>
    <StackPanel>
         <Image .../>
       <TextBlock .../>
   </StackPanel>
</Button>


用户也可以通过Template来定义Button到底应该长啥样(每一个控件都是可以自由定义的)。

虽然Button的模样可以随便定义,但是Button对外的行为却没有发生变化,最重要的就是在点击的时候会产生Click事件!我们可以简单认为,所有 具备了这个行为特征的元素组合就是Button。同样的,常见控件也有自己的行为特征。对外的行为的统一,为外部的使用提供了方便。

为了能够实现灵活组合,就不得不提到WPF的另外两个机制:

Retained-Mode Graphics

我们一直使用的GDI、DirectX等等,都是直接对屏幕进行绘画的(或者是屏幕缓冲区里),即immediate-mode graphics。具体绘制的内容操作系统是不知道的,只知道一个位图点阵。所以,当窗口因为覆盖而需要重绘屏幕的时候,需要应用程序自己来重新绘制画面 --也就是响应WM_PAINT事件。当年发明这种绘制技术,是因为硬件资源的限制,没有那么多内存资源来保存所有应用程序的屏幕。在WPF发明的时候, 内存已经足够多了,可以尝试新的模式了。应用程序在绘制屏幕的时候,不再只是描绘点阵数据,而是一个基本的图形元素,比如方形,圆形等等,再由WPF来把 这些图形元素转换成实际的位图写入图形缓冲区。除非图形元素有变更,否则屏幕的重绘工作全部由WPF自行完成。这样,应用程序就可以解放出来了。以前,要 在基于窗口的WM_PAINT上实现显示特效是多么的困难啊,为了避免闪烁,需要搞双缓冲区等等--现在就很轻松了。

Route Event

在以前基于窗口的模型里,鼠标等在子窗口上产生的事件,父窗口是收不到的,除非子窗口主动转发。这样,多个元素嵌套组合而成的UI,其事件响应就很麻烦。就 像前面的Button控件,如果在其内部子元素上点击鼠标,是否可以产生Click事件呢?是否需要每个子元素进行转发?

在WPF里,每个元素产生的事件,会以冒泡的方式从产生的地方开始一步步升到根节点。因此,它的每一个父元素都有机会对事件进行处理。这样,前面的Button控件,就可以在外围元素上接收事件,而不用担心内部有多少内嵌的元素了。



Property Value Inheritance 和Attached Property

父 元素的属性,可以自动被子元素所继承,这就是Property Value Inheritance,这样就可以大大的简化代码量,而且可以让界面的风格统一。但是,父元素和子元素的类型很多是不一样的,所以子元素要设定的属性在 父元素里不存在怎么办?于是WPF提出了Attached Property,允许任意增加的属性。比如

<StackPanel TextElement.FontSize=”30”>
    <Label />

本来StackPanel是没有FontSize这个属性的,为了传递给Label,所以通过TextElement.FontSize这种方式硬加上去了。


Dependency Property

这 个属性,跟WPF里其它的属性实现方式不一样。因为在WPF里,会存在大量的对象,而每个元素还有大量的属性值。如果每个属性值都对应一个成员变量的话, 那么将会占用大量的内存资源。所以Dependency Property并没有一个成员变量与其对应,其存贮空间在设置属性值时向WPF临时申请的。所以,其实现代码会比较复杂--因为类方法是共享的,所以相 对会比较省内存资源。

我们可以通过以下方式来设置Dependency Property,其优先级别由高至低,高级别的属性值会覆盖低级别的值。

1. Local value
2. Style triggers
3. Template triggers
4. Style setters
5. Theme style triggers
6. Theme style setters
7. Property value inheritance
8. Default value

DataBinding以及Animation也会影响Dependency Property,所以其确切取值需要当时的环境来计算得知。

Dependency Property是WPF里很多特性得以实现的基础。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值