WPF学习:1.开始
最近在学校赶毕业论文,忙里偷闲学习一些WPF,可能以后工作会用到。在CodeProject里找到一些WPF的教程,也尝试在把它翻译成中文,一方面在这个过程中可以学下WPF,另一方面也尝试养成一个总结汇总的习惯,希望自己以后能够多多在博客园这个平台上交流学习。
codeProject地址连接:http://www.codeproject.com/Articles/140611/WPF-Tutorial-Beginning
代码地址:http://feed.cnblogs.com/blog/u/143816/rss
Windows Presentation Foundation
WPF(Windows Presentation Foundation)是伴随着.NET framework3.0发布的一个新类和组件集合,它是一个新的结构,方便编程人员更灵活和有效的设计界面。
WPF的一些新特性
- 基于密度的方法独立于DPI设置,自适应调整界面的大小
- 风格和控件模板的重定义
- 控件中基于方法的资源
- 新的属性系统和捆绑能力
XAML
应用程序标记语言,元素和对象都是可见的静态的,用于应用程序用户界面而创建的一种新的描述性语言。逻辑功能还需要通过VB或C#实现。
WPF架构
托管层:WindowBase.dll,PresentationFramework.dll,PresentationCore.dll
非托管层:milcore.dll,WindowsCodecs.dll
核心API:Direct3D,User32,GDI & Device Drivers
WPF一些必须知道的术语
1. 调度和线程关联
WPF程序开始时自动启动两个线程:Rendering和Dispatcher。
Rendering:对于用户隐藏,在程序中无法直接调用。
Dispatcher:UI线程,关联到所有的元素。
不能再Dispatcher线程之外改变任何元素,想要调用或者进入组件必须调用Dispatcher。
2. 逻辑树和视觉树
逻辑树:包含在XAML声明的所有控件。
视觉树:对用户而言是“黑盒”,暴露视觉实现的所有细节。用户无法直接处理视觉书, 因为他需要知道控件包含的所有细节。
3. 路由事件
提供一种简单的事件处理方式,相比与CLR事件,对WPF提供更好的支持,为WPF提供更灵活的执行方式。
常见的路由时间方式:
冒泡:事件源向上一直到根。
隧道:根部调用事件处理程序向下深入到事件源。
直接:只有事件源才有机会响应时间(CLR事件)。
一般情况以隧道/冒泡事件为主,隧道前缀preview
4. 依赖属性
扩展CLR属性的功能,由WPF属性系统支持的属性
1.避免因继承而带来的对象膨胀。每次继承,父类的字段都被继承,这样,继承树的低端对象不可避免的膨胀。
2.大多数字段并没有被修改,一直保持着构造时的默认值,把这些字段从对象中剥离开来,减少对象的体积。
5. 硬件加速和图形渲染
自动检测硬件加速并自动的做出响应的调整。
对象层次
DispatcherObject:所有控件的母线程-UI线程
DependencyObject:对于依赖属性构建一个observer
Visual:托管库和milcore的连接
UIElement:增加像布局,输入,事件等WPF特性的功能支持
FrameworkElement:UIElement的执行
Shape:所有圆的基类
Control:和用户进行交互的UI元素。
ContentControl:所有控件的基类,只有一些简单的内容
ItemsControl:所有控件的基类。
Panel:所有panel的基类。
建立第一个WPF程序
一开始建的程序有两个xmal:App.xaml:程序描述,包含了类名,启动的UI。Window1.xaml:UI描述,主要的界面设计。逻辑功能在相应的.cs文件中。下面描述窗体基本的特性:
代码:
<Window x:Class="FirstWindowsApplication.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="63*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition MinWidth="50" /> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <TextBlock Text="Enter Name :" Grid.Row="0" Grid.Column="0" /> <TextBox x:Name="txtName" Grid.Row="0" Grid.Column="1" MinWidth="50"/> <Button Content="Click Me" Grid.Row="0" Grid.Column="2" Click="Button_Click"/> </Grid> </Window>
Height:窗体高度。Width:窗体宽度。Title:窗体的文本。
<Grid>界面的布局
RowDefinitions
ColumnDefinitions 将网格拆分为一个个单元格,有几个RowDefinitions代表分成几行,几个ColumnDefinitions代表分成几列。大小有“数值”,“Auto”和*。
Button中的Click触发路由事件。