




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、WPF第四课命令、资源、模板命令我们已经知道WPF里已经有了路由事件,可以发布及传播一些消息,那为什么还需要命令呢?这是因为事件指负责发送消息,对消息如何处理则不管,而命令是有约束力,每个接收者对命令执行统一的行为,比如菜单上的保存,工具栏上的保存都必须是执行同样的保存。命令系统的基本元素:命令(Command):WPF的命令实际上就是实现了ICommand接口的类,平时使用最多的就是RoutedCommand类。我们还会学习使用自定义命令。命令源(Command Source):即命令的发送者,是实现了ICommandSource接口的类。很多界面元素都实现了这个接口,其中包括Button,
2、ListBoxItem,MenuItem等。命令目标(Command Target):即命令发送给谁,或者说命令作用在谁的身上。命令目标必须是实现了IInputElement接口的类。命令关联(Command Binding):负责把一些外围逻辑和命令关联起来,比如执行之前对命令是否可以执行进行判断、命令执行之后还有哪些后续工作等。四个命令元素之间的关系基本元素之间的关系这些基本元素的关系体现在使用命令的过程中。命令的使用大概分为以下几步:(1)创建命令类:如果命令没有涉及到业务逻辑的话,一般使用WPF类库的RoutedCommand类即可,如果要声明相对逻辑复杂一些的类,可以实现RouteC
3、ommand类的继承或者是ICommand的接口。(2)声明命令实例:由于命令的普遍性,一般情况下程序中某类命令只需要一个命令实例即可(单件模式)。(3)指定命令的源:即指定由谁来发送命令。通常是可以点击的控件,命令还有个好处就是,没有准备好的命令,这个控件不可用。(4)指令命令目标:命令目标并不是命令的属性,而是命令源的属性。指定命令目标是告诉命令源向哪个组件发送命令。无论这个组件是否拥有焦点他都会收到这个命令。如果没有为源指定命令目标,则WPF系统认为当前拥有焦点的对象就是命令目标。这个步骤有点像为火炮指定目标。(5)设置命令关联:炮兵是不能单独战斗的,就像炮兵在设计之前需要侦察兵观察敌情
4、、判断发射时机,在射击后观测射击效果,帮助修正一样。WPF命令需要CommandBinding在执行之前来帮助判断是不是可以执行、在执行后做一些事来“打扫战场”。命令参数命令具有一处声明,处处使用的特点,比如New命令,在程序的任何地方它都表示要求命令目标新建数据,所以它们的实例永远只能有一个,这就引起了一个问题:如果界面上有两个按钮一个用来创建Student档案,一个用来创建Teacher档案。都使用New命令的话,程序应该如何区别新建的是什么档案呢?答案是使用CommandParameter,命令源一定是实现了ICommandSource接口的对象,而ICommandSource有一个属性
5、就是CommandParameter,如果把命令看作飞向目标的炮弹,那么CommandParameter就相当于装载在炮弹里面的“消息”。ICommand接口与RoutedCommandWPF中的命令是实现了ICommand接口的类。ICommand接口非常简单,只包含两个方法和一个事件:Execute方法:命令执行,或者说命令执行于命令目标之上。需要注意的是,现实世界中的命令是不会自己执行的,而这里,执行变成了命令的方法,有点拟人化的味道。CanExecute方法:在执行之前探知命令是否可以执行。CanExecuteChanged事件:当命令的可执行状态改变的时候,可激发此事件通知其它对象。
6、RoutedCommand就是一个实现了ICommand接口的类。RoutedCommand在实现ICommand接口时,并未向Execute和CanExecute方法中添加任何逻辑,也就是说,它是通用的、与具体的业务逻辑无关的。制定自定义Command说到自定义命令,我们可以分为两个层次来理解。第一个层次比较浅,指的是当WPF命令库里面没有包含想要的命令时,我们就得声明自己定义的RoutedCommand实例。第二个层次是指从继承ICommand接口开始,第一自己的命令并把某些业务逻辑包含在命令里,这才称得上是真正意义上的自定义命令。但是WPF中的命令源和CommandBinding就是专门
7、为RoutedCommand编写的,如果我们想使用自己的ICommand派生类就必须连命令源一起实现(即实现IComamndSource接口)。资源每个WPF界面元素都有一个名为Resource的属性,这个属性继承至FrameworkElement类,其类型为ResourceDictionary。ResourceDictionary能够以键值对的形式存储资源,当要使用到某个资源的时候,使用键值对的形式获取资源对象。在保存资源时,ResourceDictionary视资源对象为Object类型,所以再使用资源时先要对资源对象进行类型转换,XAML编译器能够根据Attribute自动识别资源类型,
8、如果类型不对就会抛出异常,但在C#中检索到资源对象之后,类型转换的事情就只能由我们自己来做了。当资源被存储进资源词典之后,我们可以使用两种方式来使用这些资源-静态方式和动态方式。静态资源使用StatickResource指的是程序载入内存时对资源的一次性使用,之后就不在去访问这个资源了;动态资源(DynamicResource)使用指的是在程序运行过程中仍然回去访问资源。显然如果你确定某些资源在程序初始化的时候只使用一次、之后不会再改变,就应该使用StaticResource。二进制资源为了不把资源词典里的资源和应用程序里面内嵌的资源搞混,我们明确称呼资源词典里面的资源为“WPF资源”或“对象
9、资源”,称呼应用程序内嵌资源为“程序集资源”或者“二进制资源”。特别提醒一点,WPF中写在.标签内的资源仍然是WPF资源而非二进制资源。如果要添加的资源是字符串而非文件,我们可以使用应用程序名称空间下的Resources.resx资源文件。Resources.resx文件内容的组织形式也是“键-值”对,编译后,Resources.resx会形成Properties名称空间中的Resource类,使用这个类的方法或属性就能获取资源。为了让XAML编译器能够访问这个类,一定要把Resources.resx的访问级别由Internal改为public。利用资源文件编辑器,可以资源文件的字符串里添加两
10、个条目,然后分别在XAML代码和C#代码中访问他们。二进制资源如果要添加的资源不是字符串,而是图标、图片、音频或者视屏。方法就不是使用Resources.resx了,WPF不支持这么做。在WPF使用外部文件作为资源,仅需要将其简单的放入项目即可。方法是在项目管理器上右击项目名称,在弹出的菜单里选择New-NewFolder,按需要新建几层文件夹来存放资源,然后在恰当的文件夹上右击,在弹出的菜单里选择Add-Existing Item.,在文件对话框里选择文件后单击Add按钮,文件就以资源的形式加入项目中了。有一点特别提醒大家,如果想让外部文件编译进二进制资源,必须在属性窗口把文件的Build
11、Action属性值设为Resource。模板从字面上看,模板就是“具有一定规格的样板”,有了它,就可以依照它制造很多一样是实例。以往的GUI开发技术(ASP.NET+Winform)中,控件内部逻辑和数据是固定的,程序员不能改变;对于控件的外观,程序员能做的改变也非常的有限,一般也就是设置控件的属性,想改变控件的内部结构是不可能的。如果想扩展一个控件的功能或者更改器外观让其更适应业务逻辑,哪怕只是一丁点的改变,也需要创建控件的子类或者创建用户控件。造成这个局面的根本原因是数据和算法的“形式”和“内容”耦合的太紧了。在WPF中,通过引入模板微软将数据和算法的内容与形式接耦合了。WPF中的Temp
12、late分为两大类:ControlTemplate:是算法和内容的表现形式,一个控件怎么组织其内部结构才能让它更符合业务逻辑、让用户操作起来更舒服就是由它来控制的。它决定了控件“长成什么样子”,并让程序员有机会在控件原有的内部逻辑基础上扩展自己的逻辑。DataTemplate:是数据内容的展示方式,一条数据显示成什么样子,是简单的文本还是直观的图形就由它来决定了。DataTemplate一样的内容可以用不同的形式来展现,软件设计称之为“数据-视图”模式。以往的开发技术,如MFC、Winform、A等,视图要靠UserControl来实现。WPF不但支持UserControl还支持DataTem
13、plate为数据形成视图。DataTempldate常用的地方有三处,分别是:ContentControl的ContentTempldate属性,相当于给ContentControl的内容穿衣服。ItemControl的ItemTemplate,相当于给ItemControl的数据条目穿衣服。GridViewColumn的CellTempldate属性,相当于给GridViewColumn的数据条目穿衣服。ControlTemplate控件有着自己的行为,比如显示数据、执行方法、激发事件等。控件的行为要靠编程逻辑来实现,所以也可以把控件的行为称为控件的算法内容。举个例子,WPF中的CheckBox与其基类ToggleButton的功能几乎完全一样,但外观差别上却非常的大,这就是更换ControlTemplate的结果。实际项目中,ControlTemplate主要有两大用武之地:通过更换ControlTemplate来更换控件的外观,使之具有更优的用户体验和外观。借助ControlTemplate,程序员和设计师可以并行工作,程序员可以使用WPF标准控件进行编程,等设计师的工作完成之后,只需要把新的ControlTemplate应用的程序中即可。DataTemplate和ControlTempl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广西海关考试试题及答案
- 园林初级考试试题及答案
- 交运驾驶员考试试题及答案
- 《学前儿童健康照护 》电子教案-2-4 体格生长偏离与营养异常应对-教学设计
- 胃食管反流诊断及治疗
- 北京市顺义区第一中学2023-2024学年高一上学期12月月考数学含解析
- 血管炎治疗方法
- 睾丸疝的诊断与治疗
- 二年级第二学期数学期末测试题答案
- 政治:哲学知识体系讲稿
- 2025年四川省成都市高新区中考数学二诊试卷
- (高清版)JTGT D81-2017 公路交通安全设施设计细则
- (正式版)SHT 3551-2024 石油化工仪表工程施工及验收规范
- 信息系统网络安全应急预案
- 【图文】GB8624-2012建筑材料及制品燃烧性能分级(精)
- 缺血性脑卒中患者血压管理之路
- 钢纤维混凝土检查井盖J
- 辽宁工程技术大学开题报告示例
- 房屋租赁合以装修费抵租金
- 马云-冬天的使命原稿
- 压力前池终稿1
评论
0/150
提交评论