浅谈WPF架构及其应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浅谈 WPF 架构及其应用
王婵娟
(广州大学华软软件学院 广东 从化 510990)
【摘 要】本文介绍了微软新一代开发技术 WPF 的架构,“数据驱动”理念,及其新特性,并通过一个 AddNot e 应用程序简单说明了如何使 用这些新特性。

【关键词】WPF XA ML ;数据驱动
WPF ,Windows Presentation Foundation , 是微软新一代开发技术,
涵盖了桌面应用程序开发、 网络应用程序开发和移动应用程序开发, 是微软开发技术未来十年的主要方向。

WPF 基于微软.NE T 平台,目前 最新版本为 4.0。

WPF 基于 DirectX 底层接口,带来优秀的图形向量渲
染引擎,因此相对于上一代 GDI/GD I +编程模型有了质的飞跃,可以轻
松实现 2D/3D 绚丽效果,比如半透明、图形翻转、平移、缩放等等。

1 “事件驱动”、“数据驱动”
在保持代码可维护性的前提下,如何让数据能够顺畅地到达界面 并灵活显示,同时方便地接收用户的操作历来都是表示层开发的核心 问题。

在 WPF 出现之前,Window s Forms 、 (Web Forms )等技术 均使用“事件驱动”理念,这种由 “ 事件-> 订阅-> 事件处理器 ” 关系交
织在一起构成的程序,很容易造成代码变得复杂难懂、bug 难以排除。

而 WPF 技术则是微软在开发理念上的一次升级— 由“事件驱动”变为
“数据驱动”。

在“数据驱动”下,当数据发生变化时,会主动通知界面控件、推动 控件展示最新的数据;同时,用户对控件的操作会直接送达数据,就好 像控件是“透明”的。

在这种理念中,数据占据主动地位、控件和控件事 件被弱化。

数据与界面之间的桥梁是数据绑定(Data Binding ),通过这 个桥梁,数据可以流向界面,再从界面流回数据源。

2 WPF 架构及特性
得界面描述代码和程序代码得以分开,从而提高了开发效率并有利于
团队开发。

XAML 类似于 XM L ,但是进行了一些扩展。

下面是一个按钮示例: <Button Background="Blue" Foreground="Red" Content ="This is a
button"/> 该按钮背景为蓝色,前景为红色,内容为“This i s a button ”。

依赖属性
“依赖属性”是 WPF 的一个重要的特性。

它和一般的.NET 属性看起来很相似,但是更加复杂和强大,是一种可以自己没有值,并能通过
使用 Binding 从数据源获得值(依赖在别人身上)的属性。

主要区别在于:平常的.NET 的值直接读取于类的一个私有属性, 而 WPF 允许对象在被创建的时候并不包含用于存储数据空间 (即字
段所占用的空间)、只保留在需要用到数据时能够获得默认值、借用其 他对象数据或实时分配空间的能力—— 这种对象就称为依赖对象 (Dependency Object ),
而它这种实时获取数据的能力则依靠依赖属性 (Dependency Property )来实现。

2.3 路由事件
路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。

路由事件使用以下三个路
由策略之一:
2.4 冒泡: 针对事件源调用事件处理程序。

路由事件随后会路由到
后续的父元素, 直到到达元素树的根。

大多数路由事件都使用冒泡 路由策略。

冒泡路由事件通常用来报告来自不同控件或其他 UI 元
素的输入或状态变化。

架构
2.1 直接: 只有源元素本身才有机会调用处理程序以进行响应。


与 Windows Forms 用于事件的“路由”相似。

但是,与标准 CLR 事件 不同的是,直接路由事件支持类处理(类处理将在下一节中介绍)而且可以由 EventSetter 和 EventTrigger 使用。

隧道:最初将在元素树的根处调用事件处理程序。

随后,路由事
件将朝着路由事件的源节点元素(即引发路由事件的元素)方向,沿路由线路传播到后续的子元素。

在合成控件的过程中通常会使用或处理隧道路由事件,这样,就可以有意地禁止显示复合部件中的事件,或者将其替换为特定于整个控件的事件。

在 WPF 中提供的输入事件通常是以隧道/冒泡对实现的 。

隧道事件有时又称作 Preview 事件 , 这是由隧道/冒泡对所使用的命名约定决定的。

作为应用程序开发人员,不需要始终了解或关注正在处理的事件是否作为路由事件实现。

路由事件具有特殊的行为,但是,如果在引发
该行为的元素上处理事件,则该行为通常会不可见
如下:
图 2.1 WPF 架构图
从上图可以看出 ,WPF 主 要 由 Presentation -Framework 、 PresentationCore 、mil c ore 三层组件构成;C omm on Language Runtime 是.
NET 框架平台,D irect X 、User32 是 Windows 子系统。

前两个组件都是 基于.N ET 进行开发的 , 而 milcore 由于性能影响较大 , 采用了非托管 代码进行开发,这样可以与 DirectX 进行紧密集成,提高效率。

2.2 XAML 20 世纪 90 年代中期, 基于 SGML 衍生出的 XML 的应用已变得 极为流行。

许多开发者把 XML 视为解决所有计算机开发问题的灵丹
妙药,XML 几乎无处不在。

针对 Windows Vista/7 操作系统, 微软提供了专门的界面开发语
言 XAML (eXtensible Applic ation Mark up Language ,可扩展应用程序标 记语言)。

XAML 作为界面描述语言,它最终会被编译成.NET 后台代码。

因 此, 它能够同后台进行逻辑处理的.NET 语言如 C#、J#、C++、VB 等协 同工作,其工作性质类似于 中 的 HTML 。

XAML 的产生,使
Privat e void OnClickElementMouseDown (object sender, MouseButtonEventArgs e) { e.Handled = true; }
其他特性
WPF 作为新一代界面技术,还具有许多划时代的特性及功能。

比 如资源组织、布局、控件自定义、数据绑定、动画、多媒体支持等等。

限 于篇幅,不再做过多介绍。

3 实现一个基于 WPF 开发的 AddNote 应用程序
2.5 需求说明
基于快速简洁记录信息的原则,开发一个 AddNote 应用程序。


程序可以以文本形式保存已添加的信息,并能快速添加新的信息。


3.1
程序基于 Visual Studio 2010 的 WPF 开发框架。

3.4.1 ListView 中数据源的绑定问题
基于 WPF 的“数据驱动”的原则,在 WPF 中可以很容易实现控件
随着数据源的更新而更新,只需要将控件与数据源之间建立关联就可 以。

ListView 是一个列表控件中,可以利用它的 ItemsSource 属性绑定
一个集合对象作为其数据源。

从 3.3 节的 XAML 标签代码中可以看到, 在 ListView 中有三列信息, 分别由 GridViewColumn 标签定义 , 每一列关联一个数据 , 例如 “ 文
件 界面设计 3.2 名 ” 列
关 联 FileName , “ 大 小 ” 列 关 联 Si z e , “ 修 改 时 间 ” 列 关 联 这三列都是相互关 联 的 三 个 集 合 , 可 以 定 义 一 个
Modify_Time 。

FileNode 类包含这三个信息,紧接着定义一个有关这个类对象的集合 对象,并绑定到 ListView 控件即可。

实现代码如下:
public class FileNode
{
public string FileName { get; pri v ate set; } public string Size { get; pri v ate set; }
public string Modify_Time { get; pri v ate set; }
}
private ObservableCollection <FileNode > _FileCollection = new ObservableCollection<FileNode>();
public MainWindow() {
InitializeComponent();
lsv.DataContext = _FileCollection; ...... }
其中, 在使用集合类型作为列表控件的 ItemsSource 时一般考虑 用 ObservableCollection<T> , 而 不 用 List <T > , 因为将前者的对象赋值 给控件的 DataContext 依赖属性后, 能把集合的变化立刻通知显示它 的列表控件,改变会立刻显现出来。

3.4.2 ListView 中双击事件的问题
ListView 中的每一行信息为 一 项 Item , 但是该控件没有相应的 图 3.1 主界面窗口 如图 3.1 所示为主界面窗口,用一个 Menu 控件提供 “ 添加 ”、 “
关 于”、“退出”功能,ListView 控件提供文件浏览功能,点右键可弹出“删
除”菜单。

当点击“添加”菜单时弹出添加窗口,如下图所示。

图 3.2 添加窗口 为了简单快捷考虑,添加窗口只设置了“标题 ” (TextBox 控件 ) 和 “内容”(Ric hT extBox 控件)两项,其中“标题”一栏设置有默认值。

并通 过按钮“保存”添加信息,“取消”按钮放弃操作。

在主窗口中双击某一 项,也会弹出该窗口显示已添加的选中的信息,作进一步查看或修改 之用。

3.3 XAML 设计
ItemDoubleClick 事件来实现双击某一项的动作 , 只 能 借 助 于 MouseDoubleClick 事件来实现。

这会有问题:当双击标题行时也会触 发该事件。

所有首先得判断双击的是 Item ,还是标题行。

实现代码如 下

该 程 序 涉 及 两 个 窗 口 , 共 设 计 两 个 XAML 文 件 , 分 别 是 privat e void lsv_MouseDoubleClick (object sender, MainWindow.xaml 和 AddWindow.xaml 。

MainWindow.xaml 中标签说明
如下: <Menu ........> <MenuItem Name="Add " Header=" 添加" C lick ="Add_Click " />
<MenuItem Name = "About" Header = " 关 于 " Click = " About_Click " />
<MenuItem Name="Exit " Header=" 退出" Click ="Exit _C lick " />
</Menu> <ListView Grid.Column = "0" Name = "lsv" ItemsSourc e = " {Binding}" MouseDoubleClick="lsv_MouseDoubleClick"> <ListView.ContextMenu> <ContextMenu>
MouseButtonEventArgs e)
{
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep ! = null) && ! (dep is ListView Item)) {
dep = VisualTreeHelper.GetP arent(dep); } if (dep == null) return; else {
//要执行的操作
} } 删
除 " Click = " <MenuItem Name = "Remove " H eader = " Remove_Click " /> </ContextMenu> </ListView.ContextMenu> <ListView.View> <GridView x:Name="grv">
RichTextBox 中读写文本的问题
在 WPF 中 ,RichTextBox 中的内容不再通过 Text 属 性 读 取 或 写 入, 而是同过 Document 属性, 这可以适应更为复杂多变的文本的读 写,但相应的也给初学者带来一定的难度。

其中, 将文本文件中的内容显示于 RichTextBox 控件中的代码如 下:
StreamReader sr = new StreamReader(filename, Encoding.UTF8); XmlReader xr = XmlReader.Create(sr); rtbContent.Document = (Flow Document)XamlReader.Load(xr); 将 RichTextBox 中的内容保存于文件中的代码如下:
string text = XamlWriter.Save(rtbContent.Document);
File.AppendAllText(filename, text, E ncoding.UTF8); 3.4.3 <GridViewColum n DisplayMemberBinding = " {Binding FileName,Mode=OneWay}" Header=" 文件名" />
<GridViewColum n DisplayMemberBindin g ="{Bindin g Size,
Mode=OneWay}" Header="大小" />
<GridViewColum n DisplayMemberBinding = " {Binding Modify_Time,Mode=OneWay}" Header=" 修改时间" /> </GridView > </ListView.View >
</ListView>
总结
4 关键问题的解决 3.4 WPF 其实不仅仅是图形引擎而已 , 它提供了一 ( 下转第 544 页)
由于工件较薄,刚性较差,工序多,如果单纯采用常规的通用夹具
来装夹工件及切削加工,将难于控制工件的变形,很难达到技术要求,
提高了工人装夹工件的难度。

因此,需要设计出一套适合图1 所示零
件的专用夹具,如图2、3、4、5 所示。

(1)图2、3.所示夹具,分别适合于附表1 中30 工序和40 工序,图
4 为夹具与四轴的连接。

(5)为了保证(即)和的精度,避免由于装
夹而产生工件变形,以至尺寸超差,50工序和60 工序同样在定位方
式上采用“一面两孔”定位,夹紧方式采用压板压紧的方式将工件固定
于夹具之上,(如图7 图8 所示)。

图7图8图4图5结束语
4
(2)图4、5 所示夹具,分别适合于50 工序和60 工序。

30 工序,40工序,50工序和60 工序,均设计了各自的专有夹具,
采用典型的“一面两销”定位方式,采用该定位方式的优点在于,一次
装夹可以限制 6 个自由度,安全可靠,在装夹方面,大大降低了对操作
员装夹的技术难度,提高了装夹的速度。

(3)根据加工中基准先行的原则,通过10 工序采用三轴加工中
心,采用虎钳装夹,毛坯外形定位的方式。

(4)为后序能实现对工件完成最大范围的加工,30 工序和40 工
序在定位方式上采用“一面两孔”定位,夹紧方式采用螺丝反拉的方
式,将工件固定于夹具之上,并将螺丝帽沉于夹具中,(如图6 所示)。

通过对夹具设计与装夹,有效的解决了反复装夹,零件加工的尺
寸精度和大批量加工中的尺寸稳定性。

操作者在实际加工
过程中的操作,大大提高批量零件加工效

作者简介:陈裕银,加工中心高级技师,加工中心高级考评员,1993年7 月
至2005年9 月,广州白云模具厂从事模具设计、模具加工、数控编程与加工,
2005年9 月至2006年11月,广东机电职业技术学院从事数控编程与加工实习
教学,2006 年11 月至今,广东省机械技师学院,培训鉴定与校企合作部副主任,
从事校企合作产品生产与实训教学。

[责任编辑:常鹏飞]图6图7
(上接第531 页)种全新的开发模式,由“事件驱动”转变为“数据驱
动”。

当然对于普通用户而言,最直观的就是界面越来越漂亮,看起来
越来越舒服了。

但对于开发人员而言,界面显示和代码将更好地得到
分离,这与从前的桌面应用程序开发由很多不同。

本文通过AddNote
这个小应用程序,浅尝了WPF 的强大功能,体会了WPF 的数据绑定、
依赖属性、路由事件等新特性。

当然,要做出更好、更的软件,还
需要深入了解WPF 及.NET 编程,编写更复杂的代码

【参考文献】
[1]Pe t zold C. Win do w s P re sen tati on Fou nda tion程序设计指南[M].蔡学镛,译.北
京:电子工业出版社,2008:844-845.
[2]刘铁猛.深入浅出WP F[M].北京:中国水利水电出版社,2010:80-101.
[责任编辑:常鹏飞]
(上接第542 页)计量、最大需量计量和预付费等;保护功能,包括过电
流、过电压保护与防窃电等;通信功能,可以是通过RS485、RS232 接
口与数据网关进行数据交换,实现与上位机通信、红外通信、无线电通
信或IC 卡模式等。

在电能计量表功能发展的带领下,抄表也经历了不同的时期,实
现了从手动抄表到自动抄表的过渡,其中出现了以PDA(掌上电脑)为
代表的手持式抄表器、IC 卡表自动抄表系统、电力载波自动抄表系
统、区域远红外抄表、车载抄表系统等。

本设计中采用RS485 接口与
电能管理系统中的智能数据网关进行通信,并且通过以太网与上位机
连接从而实现远程电能管理。

中的优势将进一步得以体现,此类电深远的前景,对
其的研究和设计也具有重要的社会意义

【参考文献】
[1]赵伟,庞海波,刘灿涛.电能表技术的发展历程[J].电测与仪表,1999,36(6):4-
7.
[2]郭松林,林海军,张礼勇.电子式电能表专用芯片的分类及原理[J].电测与仪
表,2002,39(10):5-7.
作者简介:哈建红(1970—),女,回族,宁夏灵武人,2004年毕业于宁夏广播
电视大学电力系统及其自动化专业,助理工程师,现主要从事电表修校方面的
工作。

结束语
4。

相关文档
最新文档