WP7有约(六):AppBarUtils使用指南

Written by Allen Lee

没有你的生活,我开始写小说,好多画面好多灵感,我要把稿费都给你。

– 周杰伦, Mine Mine

这节课的任务

我们知道,Windows Phone的Application Bar并不支持数据绑定,这意味着我们无法像Silverlight的Button控件那样把Application Bar上的按钮或者菜单项直接绑到视图模型的命令属性。

为了解决这个问题,我们可以借助一些第三方工具包,比如今天我给大家介绍的AppBarUtils,它提供了一组Expression Blend行为,可以实现Application Bar上的按钮和菜单项的绑定。接下来,我们将会具体看看如何使用这个工具包实现相关的功能。

首先,假设我们的应用包含了图1-1所示的Application Bar。

图 11 Application Bar

其中,add按钮和clear菜单项分别绑到视图模型的两个命令属性,它们分别负责把数据添加到页面的ListBox控件里和清空ListBox控件里的内容;sync按钮将会执行视图模型的Sync方法;而statistic菜单项将会打开统计结果页面。

在开始之前,你需要到http://appbarutils.codeplex.com/下载AppBarUtils的dll,并在项目里引用它。

按钮和菜单的命令绑定

在Expression Blend里单击左边工具栏上的Assets按钮打开Assets窗口,选择Behaviors类别,然后从右边把AppBarItemCommand拖到Objects and Timeline面板的[PhoneApplicationPage]上,如图2-1所示。

图 21 添加AppBarItemCommand

看到这里,你可能会问,为什么是拖到[PhoneApplicationPage]上呢?因为Application Bar上的按钮和菜单项并非依赖对象,Expression Blend的行为无法和它们关联,而在Windows Phone的应用程序唯一能够访问Application Bar的地方就是页面,所以我们需要把AppBarItemCommand拖到[PhoneApplicationPage]上。

重复上述步骤添加一个AppBarItemCommand。现在我们有两个AppBarItemCommand,分别用于add按钮和clear菜单项。

在Objects and Timeline面板上选中第一个AppBarItemCommand,然后在Properties面板上把Id属性设为add,如图2-2所示。

图 22 设置Id属性

因为AppBarItemCommand是根据Text属性的值查找Application Bar上的按钮的,所以Id属性的值必须匹配Text属性的值。

接着,切换到XAML模式,把AppBarItemCommand的Command属性绑到视图模型的对应的命令属性,如代码2-1所示。

代码 21 设置Command属性的绑定

<AppBarUtils:AppBarItemCommand Id="add" Command="{Binding AddCommand}"/>

看到这里,你可能会问,为什么不直接在Properties面板上设置Command属性的绑定呢?这是因为Expression Blend对Behavior的ICommand类型的属性做了特殊处理,如上面的图2-2所示,这使得Command属性看起来不像普通属性,右边也没有Advanced options按钮,所以无法打开数据绑定对话框。

至于clear菜单项,我们需要在Properties面板上把Id和Type两个属性的值分别设为clear和MenuItem,如图2-3所示。

图 23 设置Id和Type两个属性

需要说明的是,Type属性是用来区分Application Bar上的按钮和菜单项这两种类型的,它的默认值是Button,因此,当你在按钮上使用AppBarItemCommand时,你不需要设置这个属性的值。

最后是Command属性的绑定,和前面一样,我们需要切换到XAML模式设置绑定表达式,如代码2-2所示。

代码 22 设置Command属性的绑定

<AppBarUtils:AppBarItemCommand Type="MenuItem" Id="clear" Command="{Binding ClearCommand}"/>

使用Expression Blend SDK的行为

你知道吗,Expression Blend SDK提供了许多有用的行为,其中一个是CallMethodAction,它可以用来执行指定对象的指定方法,显然非常适合我们的sync按钮,不过,它需要和Trigger一起工作,而Expression Blend SDK并未提供适用于Application Bar的Trigger,怎么办?这个时候就轮到AppBarItemTrigger出场了。

打开Assets窗口,选择Behaviors类别,然后从右边把CallMethodAction拖到Objects and Timeline面板的[PhoneApplicationPage]上,如图3-1所示。

图 31 添加CallMethodAction

确保CallMethodAction处于选中状态,在Properties面板上TriggerType右边的New按钮,如图3-2所示。

图 32 单击New按钮

在弹出的Select Object对话框里选择AppBarItemTrigger,如图3-3所示,然后单击OK按钮关闭对话框。

图 33 选择AppBarItemTrigger

此时,Trigger的相关属性将会换成AppBarItemTrigger的,把Id属性的值设为sync,如图3-4所示。

图 34 AppBarItemTrigger的属性

至于CallMethodAction本身的属性,我们只需把TargetObject属性绑到指定对象,然后把MethodName属性的值设为指定方法的名字就行了。

页面导航行为

有了AppBarItemTrigger,我们就可以使用Expression Blend SDK的NavigateToPageAction为Application Bar实现打开页面的操作了,当然,更简单的办法是直接使用AppBarItemNavigation,它的用法和AppBarItemCommand类似,只是Command属性换成了TargetPage属性。

如果你希望在URI里包含查询字符串,而参数的值又是绑到视图模型的属性的,那么,你可以试试NavigateWithQueryStringAction。

打开Assets窗口,选择Behaviors类别,然后从右边把NavigateWithQueryStringAction拖到Objects and Timeline面板的[PhoneApplicationPage]上,如图4-1所示。

图 41 添加NavigateWithQueryStringAction

确保NavigateWithQueryStringAction处于选中状态,在Properties面板上Trigger改为AppBarItemTrigger,然后把Id、Type和TargetPage三个属性的值分别改为statistic、MenuItem和/StatisticPage.xaml,如图4-2所示。

图 42 设置相关属性

假设我们希望包含的查询字符串是"hitcount=XX&timecount=YY",其中,XX和YY分别来自视图模型的HitCount和TimeCount两个属性,那么,我们可以通过NavigateWithQueryStringAction的Parameters属性进行设置。

在Properties面板上单击Parameters属性右边的Edit items in this collection按钮,在弹出的Parameter Collection Editor对话框里单击Add another item按钮添加一个参数,把Field属性的值设为hitcount,把Value属性绑到视图模型的HitCount属性,如图4-3所示。

图 43 添加参数

用同样的办法添加一个timecount参数,并把它的Value属性绑到视图模型的TimeCount属性。

根据上述设置,NavigateWithQueryStringAction将会为我们创建一个这样的URI:/StatisticPage.xaml?hitcount=9&timecount=13(假设用户单击statistic菜单项时,HitCount和TimeCount两个属性的值分别为9和13)。

由于NavigateWithQueryStringAction是一个TriggerAction,这意味着它的用途并不限于Application Bar,你可以通过Expression Blend SDK的EventTrigger把它用到Silverlight的Button控件(或者其它控件)上。

最后,如果你需要的只是一个简单的后退,你可以使用GoBackAction。和NavigateWithQueryStringAction一样,你可以通过AppbarItemTrigger把它用到Application Bar上,也可以通过EventTrigger把它用到Silverlight的Button控件(或者其它控件)上。

绑定启用状态和显示文字

有些时候,你可能希望Application Bar上的按钮和菜单项可以根据某些条件自动调整启用状态,比如说,当页面的ListBox控件里有内容时,sync按钮才可用,否则,它应该处于禁用状态。

AppBarItemTrigger提供了一个IsEnabled依赖属性,当我们把它绑到视图模型的某个bool类型的属性时,前者会监听后者的更改,然后把修改后的值反映到Application Bar上的按钮或者菜单项的IsEnabled属性。

如果你使用的是AppBarItemCommand,你可以通过ICommand.CanExecute方法的返回值指定启用/禁用状态,并在状态发生更改的时候触发CanExecuteChanged事件,剩下的事情AppBarItemCommand会帮你处理好的。

至于Application Bar上的按钮和菜单项的显示文字,你也可能希望实现绑定,这种需求通常出现在多语言支持的应用里,这个时候,你可以把AppBarItemTrigger的Text依赖属性绑到资源对象的某个属性,前者会监听后者的更改,然后把修改后的值反映到Application Bar上的按钮或者菜单项的Text属性。如果你使用的是AppBarItemCommand或者AppBarItemNavigation,你也可以通过它们的Text依赖属性实现同样的效果。

看到这里,有些同学可能会担心Id和Text两个属性打起架来,放心吧,它们不会的。虽然它们最终都是关联到Application Bar上的按钮或者菜单项的Text属性,但它们发生作用的时间是不同的。Id属性只在行为初始化的时候用来查找Application Bar上的按钮或者菜单项,一旦找到,Id属性就会功成身退了,从此刻开始,Text属性将会派上用场,它会密切关注绑定源,并把更新反映到Application Bar上的按钮或者菜单项的Text属性。

下课了……

WP7有约(六):AppBarUtils使用指南相关推荐

  1. Nginx笔记总结十六:nginx优化指南

    1.高层的配置 worker_processes 定义了nginx对外提供web服务时的worker进程数 worker_rlimit_nofile 更改worker进程最大打开文件数量限制,如果没有 ...

  2. 优思学院:ILSSI 的六西格玛黑带大师(MBB)

    ILSSI(国际精益六西格玛研究所)是全球最知名的六西格玛认证机构之一,目前在国际上有很多六西格玛领域的知名人士同样取得了ILSSI的黑带大师认证,当中包括了: Paul Allan(保罗)|ILSS ...

  3. JUST技术:JUST高效时空索引揭秘及使用指南

    一.问题背景 城市中超过80%的数据都与时空有关,如加油站点.出租车轨迹.交通路况等.这些数据多为半结构化和非结构化数据,并且需要管理的数据量巨大.传统的时空数据库管理海量数据时会出现性能严重下降的情 ...

  4. 60深度解密六十:利用互联网精准找到企业负责人的联系方式

    网络营销推广技术.技巧深度解密(六十)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解利用互联网精准找到负责人联系方式的问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. ...

  5. 优思学院|2022年获美质协ASQ和ILSSI奖项的《精益六西格玛的十条戒律》

    精益六西格玛是一种强大的方法论,它可以减少组织中的浪费和变异,最终将运营成本降到最低.优化生产力,并最大限度地提高客户满意度. 成功的故事不言自明,但并不是所有的精益六西格玛故事都有一个圆满的结局,过 ...

  6. nVIDIA标准计算体系结构(编程指南)

       一. 简介 1.1    在数据上并行的图形处理单元擅长计算特别是并行计算,源于硬件设计上更多的偏重于数据处理,而不是像CPU一样既重视数据缓存还要兼顾流水线控制. 高算术强度(算术强度=算术操 ...

  7. 我爱机器学习网机器学习类别文章汇总

    机器学习领域的几种主要学习方式 From Stumps to Trees to Forests KDD-2014 – The Biggest, Best, and Booming Data Scien ...

  8. 我爱机器学习--机器学习方向资料汇总

    转载:http://blog.csdn.net/shuimanting520/article/details/45748505 机器学习爱好者资料 机器学习领域的几种主要学习方式 From Stump ...

  9. 整理Windows Phone 7教程(很全面)

    前言 离Windows Phone 7正式发布已过去几个月了,但国内关于Windows Phone 7的中文书籍资料太少了,大多数是英文资料,一本真正的中文开发教程书都没有, 要啃英文资料对大部分的开 ...

最新文章

  1. 2019 快过去了,自动驾驶发展得怎么样了?
  2. 最严谨的计算机语言p,用于PLC的华P语言编译器设计及实现.pdf
  3. 电商网站的积分要不要年末清零?
  4. 【重要更新】MyEclipse 2017 Stable 1.0发布|附下载
  5. Flume fan out(扇出)详解
  6. 解决webserver tcp连接大量CLOSE_WAIT 问题
  7. Python Day10 MySQL 01
  8. C#复习笔记(2)--C#1所搭建的核心基础
  9. AutoCAD VBA创建椭圆和样条曲线
  10. laravel项目拉下来之后,项目整个的启动
  11. 在计算机编程里pi是什么意思,编程中的术语“钩子”是什么意思?
  12. 码畜 码奴 码农 IT民工和IT其他工种的划分定义
  13. 现在的 Linux 内核和 Linux 2.6 的内核有多大区别?
  14. CMS几种GC模式解读
  15. Flutter-使用http请求数据并展示
  16. 中兴回应被列入被执行人名单;摩拜否认裁员 30%;LG 支持韩国对高通罚款 9 亿美元 | 雷锋早报...
  17. 尚硅谷Docker实战教程学习总结文档
  18. Win11微软账号登录不上?Win11登录Microsoft账户出错的解决方法
  19. Linear equations
  20. 识别主机名和IP地址

热门文章

  1. C++基础与深度解析第三章:数组、vector与字符串
  2. 计算机网络7种类型,OSPF中7种类型LSA
  3. mongo3.5 java cursor,Spring Data MongoDB-需要'cursor'选项
  4. C++socket编程(七):7.3 http的响应协议
  5. 华为无盘服务器,无盘服务器操作系统
  6. 黑龙江省国二c语言报名时间,2020年9月黑龙江省全国计算机等级考试报名通知
  7. html加入购物车的动画,关于购物车添加按钮的动画
  8. Linux中b设备是什么,linux-将新设备添加到b??trfs卷中,但是可用...
  9. php通配符是什么,通配符*和?有什么区别
  10. java ppt控件_Java版PPT操作控件Spire.Presentation v3.3.5新版来袭!支持转换GroupShape到图片...