通过对上一篇"认识WPF"的学习,我们已经对WPF有了一个基本的了解,想要学习WPF则需要我们深入系统地了解WPF的系统架构和运行方式。助你轻松掌握WPF这项有趣而又炫酷的技术!
WPF系统学习综合实例下载:https://download.csdn.net/download/lvxingzhe3/87657161
系统学习WPF,需要我们从一下技术点入手:
-
XAML文档结构
-
控件和布局
-
Banding(绑定)
-
依赖属性和附加属性
-
路由事件
-
命令
-
资源
-
模板
-
绘图和动画
-
MVVM模式
-
XAML文档结构
XAML是声明性语言,在Xaml上声明一个Button,界面上就会显示一个按钮的实体控件。Xaml看起来是平面的,但其实它是按照树形结构排列的,树形结构非常重要,消息可以通过树形结构从树根传到每片树叶,我们也可以通过这颗树按名称查找元素、获取父/子节点等操作。WPF基类库中为我们准备了LogicalTreeHelper(逻辑树帮助类,查询到对象)和VisualTreeHelper(可视树帮助类,查询到对象的内部结构)两个助手类,包含用于操作这颗树的方法。Xaml文件和后台cs文件都使用了partial(部分,可以把一个类拆分多处使用)关键字,使得它们相互分离又相互依存。Xaml树形结构如下图所示:
<Grid>
<StackPanel Margin="0,50,0,0">
<TextBox Width="200" Height="30"/>
<TextBox Width="200" Height="30" Margin="0,50,0,0"/>
</StackPanel>
<Button Content="确定" Width="100" Height="30" />
</Grid>
-
控件和布局
WPF六种常用控件:布局控件、内容控件、带标题内容控件、条目控件、带标题条目控件和特殊内容控件(如:TextBox,TextBlock,Image等)。
WPF中的布局元素(指定控件布局和排列方式):
-
Grid:网格。类似HTML中的Table。
-
StackPanel:栈式面板。竖直或水平排成一条直线。
-
Canvas:画布。绝对坐标定位,类似于Windows Form的布局。
-
DockPanel:泊靠式面板。是具有停靠功能的布局控件,其内部控件根据附加属性指定停靠位置。
-
WrapPanel:自动折行面板。排满一行自动折行,类似HTML中的流式布局。
-
Banding(绑定)
WPF为了实现了UI与数据逻辑的解耦,将UI从数据逻辑中分离出来形成Xaml文件,而UI与数据逻辑之间的联系则通过Bingding来实现。Bingding就像UI与数据逻辑之间的桥梁,能够让分离的两部分组合成一个整体,实现WPF的数据驱动。
把Binding比作桥梁,那么它的两端分别是Binding的源(source)和目标(Target),Path为Binding指定访问路径(未指明路径,数据就会一直往上查找),数据从哪里来哪里就是源,Binding是驾在中间的桥梁,Binding的目标是数据去向哪里。当Binding的源变化通知目标变化时,需要通过属性的set语句激发一个ProtertyChanged事件。这个事件不需要我们自己声明,而是让数据源类实现System.ComponentModel名称空间中的INotifyPropertyChanged接口。
Binding数据流向的属性是Mode:TwoWay(双向)、OneWay(单向)、OneTime(单次)、OneWayToSource(对数据源单向)和Default(根据具体目标情况确定,如可编辑未双向模式)。数据源根据什么类型变化进行通知,可设置属性UpdateSourceTrigger:PropertyChanged、LostFocus、Explicit(显式,在程序启动时更新源)和Default。
实例如下:拖动Slider滑块值时,绑定Slider.Value的TextBox.Text跟着变化。
<Grid>
<StackPanel>
<TextBox x:Name="textBox1" Text="{Binding Path=Value,ElementName=slider1}"/>
<Slider x:Name="slider1" Maximum="100" Minimum="0"/>
</StackPanel>
</Grid>
Converter(转换器):可以将源数据和目标数据之间进行特定的转化,通常用于绑定值类型转换。
详细介绍和实例:WPF Binding(绑定)详解
-
依赖属性和附加属性
依赖属性是一种自己可以没有值,并且可以通过Binding绑定从其他数据源获取值。依赖属性可支持WPF中的样式设置、数据绑定DataGrid、继承、动画及默认值。
附加属性是一种特殊的依赖属性,它允许给这个对象添加一个不属于它的值(另一个对象的值),从而去改变另一个对象的值,它是由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性(如Text放到Grid里面,Text可以设置Grid.Row="1")。
详细介绍和实例:WPF 依赖属性和附加属性
-
路由事件
事件及消息,Windows通过消息传递信息。路由是起点到终点间有若干个中转站,从起点出发后经过每个中转站时要做出选择,最终以正确的路径到达终点。
WPF的UI是由布局组件和控件构成的树形结构,当这颗树的某个节点激发出某个事件时,事件就会在UI组件树沿着一定方向传递下去。WPF由两棵树组成:Logical Tree(逻辑树,布局组件和控件构成)和Visual Tree(Logical Tree延申到Template组件级别,及控件细节)组成。路由事件是沿着Visual Tree传递的,这样才让"藏"在Template里的控件把消息送出来。
在Winform中事件由事件的拥有者,事件的响应者和事件的订阅关系组成。而WPF的的路由事件的事件拥有者与事件响应者没有之间显示订阅关系,事件的拥有者只负责激发事件,事件将由谁响应它并不知道,事件的响应者则安装由事件监听器,针对某类事件进行监听,当有此类事件传递至此时事件响应者就使用事件处理器来响应事件并决定事件是否可以继续传递。
详细介绍和实例:WPF 路由事件
-
命令
WPF命令是一个任务的完整封装,例如保存,复制,剪切这些操作都可以理解为一个个独立的命令。乍一看,命令和传统的事件机制似乎很相似,但命令和事件并不冲突,命令和事件的区别就在于命令是具有约束力。
WPF命令系统模型主要由以下四个元素组成:
-
命令(Command):命令表示一个任务单元,并且可跟踪该任务的状态,实际上是实现了ICommand接口的类。
-
命令源(CommandSource):即命令的发送者/行为的触发者,实际上是实现了ICommandSource接口的类。
-
命令目标(CommandTarget):命令的接收者/命令的作用对象,命令目标必须是实现了 IInputElement接口的类。
-
命令关联(CommandBinding):负责把一些外围逻辑与命令关联起来,是将命令逻辑映射到命令的对象,包括命令是否可以执行前后的操作、命令执行前后的操作。
命令的特点如下:
复用: 统一命令逻辑,减少代码冗余,封装独立、可复用的任务执行单元。
分离: 通过命令可以使命令源和命令目标分离,减少代码耦合。
状态同步: 命令可以使得控件的启用状态和相应的命令状态保持同步,从而指示操作是否可用。
详细介绍和实例:WPF Command(命令)详解
-
资源
每个WPF的界面元素都具有一个名为Resources的属性,这个属性继承自FrameworkElement类,其类型为ResourceDictionary。ResourceDictionary能够以"键-值"对的形式存储资源,当许需要使用某个资源时,使用"键-值"对可以索引到资源对象。如图所示,按键的背景色设置成资源中的对应key的value值:
<Window.Resources>
<ResourceDictionary>
<SolidColorBrush x:Key="backgroudColor" Color="LightBlue"/>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Button x:Name="btn" Width="100" Height="30" Background="{DynamicResource backgroudColor}"/>
</Grid>
详细介绍和实例:WPF 资源
-
模板
WPF中的模板(Template)分为两大类:
-
ControlTemplate是算法内容的表现形式,一个控件怎样组织其内部结构才能更符合业务逻辑和需求。
-
DataTemplate是数据内容表现形式,决定一条数据显示成什么样子。
Style(样式):构成Style重要的两个元素是Setter和Trigger,Setter类帮助我们设置控件的静态外观风格,Trigger类则帮助我们设置控件的行为风格。
详细介绍和实例: WPF 模板(Template)
-
绘图和动画
WPF底层使用DirectX(多媒体编程接口)技术,能做出漂亮UI,能实现"滤镜"、"阴影"、"变形"等效果。与传统的.NET开发使用GDI+进行绘图不同,WPF拥有自己的一套图形API,绘图为矢量图。
基本图形包括以下几个,都是Shaper类的派生类。
-
Line:直线段,可以设置笔触大小(Stroke)
-
Rectangle:矩形,即有Stroke也有Fill(填充)
-
Ellipse:椭圆,长宽相等则为正圆,即有Stroke也有Fill(填充)
-
Polygon:多边形,由多条直线线段围成的闭合区域,即有Stroke也有Fill(填充)
-
Polyline:折线(不闭合),由多条首尾相接的直线段组成
-
Path:路径(闭合),可以由若干直线、圆弧、贝塞尔曲线(由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋)组成,很强大。
动画由下面几部分组成:
动画类型:DoubleAnimation,ColorAnimation,PointAnimation等
起始值:From
终止值:To
偏移量值:By
故事板:Storyboard 将动画应用于对象,Storyboard必须知道在何处应用动画,使用 Storyboard.TargetName 附加属性指定要进行动画处理的对象,使用 TargetProperty 附加属性指定要进行动画处理的属性
事件触发器:EventTrigger 创建 BeginStoryboard 对象,并将情节提要与它关联
详细介绍和实例:WPF 图形绘制 WPF 动画 WPF 3D模型介绍及使用
-
MVVM模式
MVVM是Model-View-ViewModel的简写,Model就是模型,View就是视图,ViewModel就是View和Model之间解耦和传递消息的中间层。MVVM采用双向数据绑定,View中数据变化将自动反映到ViewModel上,反之,Model中数据变化也将会自动展示在View上。通过MVVM模式使得View和Model上的修改相互不影响,方便程序分工,测试和维护。
详细介绍和实例:WPF MVVM模式构建项目
WPF系统学习综合实例下载:https://download.csdn.net/download/lvxingzhe3/87657161