强大的组合能力
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-modegraphics。具体绘制的内容操作系统是不知道的,只知道一个位图点阵。所以,当窗口因为覆盖而需要重绘屏幕的时候,需要应用程序自己来重新绘制画面--也就是响应WM_PAINT事件。当年发明这种绘制技术,是因为硬件资源的限制,没有那么多内存资源来保存所有应用程序的屏幕。在WPF发明的时候,内存已经足够多了,可以尝试新的模式了。应用程序在绘制屏幕的时候,不再只是描绘点阵数据,而是一个基本的图形元素,比如方形,圆形等等,再由WPF来把这些图形元素转换成实际的位图写入图形缓冲区。除非图形元素有变更,否则屏幕的重绘工作全部由WPF自行完成。这样,应用程序就可以解放出来了。以前,要在基于窗口的WM_PAINT上实现显示特效是多么的困难啊,为了避免闪烁,需要搞双缓冲区等等--现在就很轻松了。
Route Event
在以前基于窗口的模型里,鼠标等在子窗口上产生的事件,父窗口是收不到的,除非子窗口主动转发。这样,多个元素嵌套组合而成的UI,其事件响应就很麻烦。就像前面的Button控件,如果在其内部子元素上点击鼠标,是否可以产生Click事件呢?是否需要每个子元素进行转发?
在WPF里,每个元素产生的事件,会以冒泡的方式从产生的地方开始一步步升到根节点。因此,它的每一个父元素都有机会对事件进行处理。这样,前面的Button控件,就可以在外围元素上接收事件,而不用担心内部有多少内嵌的元素了。
Property Value Inheritance 和Attached Property
父元素的属性,可以自动被子元素所继承,这就是Property ValueInheritance,这样就可以大大的简化代码量,而且可以让界面的风格统一。但是,父元素和子元素的类型很多是不一样的,所以子元素要设定的属性在父元素里不存在怎么办?于是WPF提出了Attached Property,允许任意增加的属性。比如
<StackPanel TextElement.FontSize=”30”>
<Label />
本来StackPanel是没有FontSize这个属性的,为了传递给Label,所以通过TextElement.FontSize这种方式硬加上去了。
Dependency Property
这个属性,跟WPF里其它的属性实现方式不一样。因为在WPF里,会存在大量的对象,而每个元素还有大量的属性值。如果每个属性值都对应一个成员变量的话,那么将会占用大量的内存资源。所以DependencyProperty并没有一个成员变量与其对应,其存贮空间在设置属性值时向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里很多特性得以实现的基础。
相关文章
- Java基础知识点(类的几个补充注意事项和private关键字)
- 找店面出租要讲究的关键点,让店面独占鳌头
- (转)css中通常会用到浮动与清除,也是一个必须掌握的知识点,概念性的东西不多说,下面举几个例子,来说明它的用法:1.文字环绕效果 2.多个div并排显示 3.清除浮动(默认显示)
- 关于flex布局,我大多数常用的几个点
- Python基础知识当中容易混淆的几个知识点
- html/css基础篇——html代码编写过程中的几个警惕点
- Python中对Tuple之间排序时如何指定第几个元素为关键字排序的问题
- Java 中几个重要的关键字
- WPF RichTextBox 当前光标后一个字符是文档的第几个字符
- 也谈谈规范JS代码的几个注意点