UWP: 妙用自定义 Action 以简化并重用代码
相信每一位 App 开发者,在开发过程中,都会有一些代码被反复用到,比如:复制文本,打电话,发短信,发邮件,给应用添加评论等等。在项目之间复制这些代码段,实在不是一个好办法,所以大家可能会把这些代码放到一个类似 Utility 类中,或者一个库(Class Library)中,再加以调用。本文也是帮你完成同样的事情,不过本文是通过 Action 来完成。这两种方法的目的相同,区别是前者尽管实现了代码段封装,还是需要写代码(通常在 ViewModel 中)来调用,而后者,则只要在 XAML 上添加几行代码即可。相比而言,后者要更为方便一些。
这里的 Action 是来自 Behaviors SDK 里的概念,其实就是一个实现了 IAction 接口的类。我在本文不会介绍关于 Behaviors SDK 的基本知识,如果你对于它还不够了解,可以在园子里搜索一下相关文章,加以学习(在本文最后的参考文章处,我已经列了一篇比较不错的文章)。
本质上, Action 与 Behavior 有着相同的目的,它们都是可以重用的一段代码。在它所实现的 IAction 接口中,定义了一个 Execute 方法,这个方法会在满足条件时被执行,条件可能是控件的事件被触发,或者属性发生改变等等。在 Execute 方法中,我们可以调用那些能完成我们想要的任务的方法。
为了完成前面所述的需求,我们首先新建一个 UWP 项目并为其添加 Behavior SDK 引用(这个项目主要是为测试后面创建的 Action)。
新建一个名为 CommonTaskAction 的类,此类实现了 IAction 接口,并且我们使它继承自 DependencyObject 类,这样我们可以为它定义依赖属性,以实现在 XAML 中可通过 Binding 向其赋值。如下:
public class CommonTaskAction : DependencyObject, IAction
{
public object Execute(object sender, object parameter)
{
}
}
然后,定义一个枚举,用来表达常见任务类型,如下:
public enum CommonTaskType
{
/// <summary>
/// 复制文本
/// </summary>
CopyText,
/// <summary>
/// 打电话
/// </summary>
MakePhoneCall,
}
接着,为 CommonTaskAction 类添加几个依赖属性:TaskType(任务类型),TextToBeCopied(待复制的文本),PhoneNO(电话号码),PhoneDisplayName(打电话时的显示名称),如下:
public static readonly DependencyProperty PhoneDisplayNameProperty =
DependencyProperty.Register("PhoneDisplayName", typeof(string), typeof(CommonTaskAction), new PropertyMetadata(string.Empty)); public static readonly DependencyProperty PhoneNOProperty =
DependencyProperty.Register("PhoneNO", typeof(string), typeof(CommonTaskAction), new PropertyMetadata(string.Empty)); public static readonly DependencyProperty TaskTypeProperty =
DependencyProperty.Register("TaskType", typeof(CommonTaskType), typeof(CommonTaskAction), new PropertyMetadata()); public static readonly DependencyProperty TextToBeCopiedProperty =
DependencyProperty.Register("TextToBeCopied", typeof(string), typeof(CommonTaskAction), new PropertyMetadata(string.Empty)); public string PhoneDisplayName
{
get { return (string)GetValue(PhoneDisplayNameProperty); }
set { SetValue(PhoneDisplayNameProperty, value); }
} public string PhoneNO
{
get { return (string)GetValue(PhoneNOProperty); }
set { SetValue(PhoneNOProperty, value); }
} public CommonTaskType TaskType
{
get { return (CommonTaskType)GetValue(TaskTypeProperty); }
set { SetValue(TaskTypeProperty, value); }
} public string TextToBeCopied
{
get { return (string)GetValue(TextToBeCopiedProperty); }
set { SetValue(TextToBeCopiedProperty, value); }
}
这时,在 Execute 方法中来完成主要逻辑,添加如下代码:
public object Execute(object sender, object parameter)
{
switch (TaskType)
{
case CommonTaskType.CopyText:
if (!string.IsNullOrWhiteSpace(TextToBeCopied))
{
// 复制文本
DataPackage dataPackage = new DataPackage
{
RequestedOperation = DataPackageOperation.Copy,
};
dataPackage.SetText(TextToBeCopied);
Clipboard.SetContent(dataPackage);
}
break; case CommonTaskType.MakePhoneCall:
if (!string.IsNullOrWhiteSpace(PhoneNO))
{
// 打电话
Windows.ApplicationModel.Calls.PhoneCallManager.ShowPhoneCallUI(PhoneNO, PhoneDisplayName);
}
break;
} return true;
}
这样,一个自定义 Action 就完成了,它目前只添加了复制文本、打电话的逻辑,你可以根据自己的需求来添加其它的逻辑。
接下来,我们来看如何使用它。在 MainPage.xaml 中添加如下代码,即可:
<Page ...
xmlns:Core="using:Microsoft.Xaml.Interactions.Core"
xmlns:Interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:MyAction="using:CustomActionTest.Actions"
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid Margin="12">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Style="{ThemeResource TitleTextBlockStyle}" Text="CommonTaskAction 测试" />
<StackPanel Grid.Row="1" Orientation="Horizontal">
<TextBox x:Name="txtName"
Width="400"
Text="这里是测试文本" />
<Button Content="复制">
<Interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="Tapped">
<MyAction:CommonTaskAction TaskType="CopyText" TextToBeCopied="{Binding Text, ElementName=txtName}" />
</Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</Button>
</StackPanel> <!-- 另外一个 MakePhoneCall 就不在这里测试了,可自行测试,用法如下: -->
<!--<MyAction:CommonTaskAction TaskType="MakePhoneCall" PhoneNO="13800XXXXXX" PhoneDisplayName="联系人姓名" />-->
</Grid>
</Grid>
注意其中的 TaskType,值表达复制文本, TextToBeCopied,通过绑定,它获取到文本框的值。因而,这个 Action 就可以完成指定的任务。
理解了本文的思路,现在,你就可以把它改造成适合你的 CommonTaskAction。
如果你有更好的建议或意见,请留言互相交流。
参考文章:
Windows通用应用开发手记-Behavior SDK概述
UWP: 妙用自定义 Action 以简化并重用代码的更多相关文章
- UWP中实现自定义标题栏
UWP中实现自定义标题栏 0x00 起因 在UWP开发中,有时候我们希望实现自定义标题栏,例如在标题栏中加入搜索框.按钮之类的控件.搜了下资料居然在一个日文网站找到了一篇介绍这个主题的文章: http ...
- 使用自定义tld标签简化jsp的繁琐操作
最近做一个树形结构的展示,请求目标页面后,后台只返回简单的List,虽然有想过在jsp页面内做一些操作简化,但是太繁琐了,其他的标签又不能满足需求,所以只能自己做一个.使用tld标签可以简化jsp代码 ...
- Wix打包系列(三)自定义Action(Custom Action)
原文:Wix打包系列(三)自定义Action(Custom Action) 3.1 关于Action 我们已经知道如何生成具有标准安装界面的安装程序了,Windows Installer按照我们的界面 ...
- struts 中自定义action访问方法
struts中action类继承了ActionSupport 默认实现了execute()方法 struts.xml配置文件中 然后可以配置如下映射: <package name =" ...
- 使用DRF视图集时自定义action方法
在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...
- Android自定义action与permission!!! (转)
原文地址:http://blog.csdn.net/android_tutor/article/details/6310418#reply 大家好,今天给大家简单分享一下Android中自定义acti ...
- wxpython 支持python语法高亮的自定义文本框控件的代码
在研发闲暇时间,把开发过程中比较重要的一些代码做个珍藏,下面的代码内容是关于wxpython 支持python语法高亮的自定义文本框控件的代码,应该是对大家也有用. import keywordimp ...
- 【图像处理】Haar Adaboost 检测自定义目标(视频车辆检测算法代码)
阅读须知 本博客涉及到的资源: 正样本:http://download.csdn.net/detail/zhuangxiaobin/7326197 负样本:http://download.csdn.n ...
- 用xib自定义UITableViewCell的注意事项——重用
问题的提出: 有时候我们经常需要自定义tableView的cell,当cell里面的布局较为复杂时往往舍弃纯代码的方式而改用xib的方式进行自定义.当我们用纯代码的方式布局cell时,往往会在cell ...
随机推荐
- 自动的输入号码的辅助软件在ie浏览器下的尝试
在ie下面的自动输入号码的软件,我已经折腾了好久.由于ie环境非常复杂:网页延迟这个时间一直不能准确的得到,这个时间主要包括:网络的与服务器的交换速度,网页自身的加载速度,网页的js渲染的效果的影响. ...
- 升讯威微信营销系统开发实践:订阅号和服务号深入分析( 完整开源于 Github)
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...
- VS2013和NuGet
1.前言 有时候在使用VS2013时需要用到第三方的dll,这时候NuGet就是一个很方便的工具.但是这个小东东也是和VS不同的版本相关的,最开始不知道,乱安装一气,最后就是很多情况下不能用.这两天在 ...
- Web前端JQuery面试题(一)
Web前端JQuery面试题(一) 一:选择器 基本选择器 什么是#id,element,.class,*,selector1, selector2, selectorN? 答: 根据给定的id匹配一 ...
- UC手机浏览器js加入收藏夹
概述 对于某些网站来说,让用户一键把网页加入收藏夹的设计是非常棒的,它能提醒用户把网页加入收藏夹,从而增加用户的回访率,使网站获得更多的流量. 在PC端,只有ie和ff支持用js把网页加入收藏夹的操作 ...
- Rpc框架dubbo-client(v2.6.3) 源码阅读(二)
接上一篇 dubbo-server 之后,再来看一下 dubbo-client 是如何工作的. dubbo提供者服务示例, 其结构是这样的!dubbo://192.168.11.6:20880/com ...
- 机器学习基石笔记:03 Types of Learning
原文地址:https://www.jianshu.com/p/86b2a9cef742 一.学习的分类 根据输出空间\(Y\):分类(二分类.多分类).回归.结构化(监督学习+输出空间有结构): 根据 ...
- 树莓派连接不上WiFi
之前还好好的,突然连接不上WiFi,打开文件WiFi配置文件:/etc/wpa_supplicant/wpa_supplicant.conf发现有多个连接记录,把用到的留下,其他的删掉即可: sudo ...
- asp.net core mvc发布后显示异常错误信息的方法
在发布的项目文件夹中找到web.config文件,修改: <aspNetCore processPath="dotnet" arguments=".\Cloud.B ...
- 【干货】Jquery.Datables与Bootstrap3的组合使用
官方地址 datatables官方网址:www.datatables.net 下载bootstrap3与datables文件包 引用文件 css:bootstrap.css.dataTables.bo ...