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 ...
随机推荐
- Eigen3安装及注意
执行命令: sudo apt-get install libeigen3-dev 安装后执行以下命令 运行命令: sudo cp -r /usr/include/eigen3/Eigen /usr/i ...
- 了解Serverless架构
1 概述 Serverless中文译为“无服务”是一种新兴起的架构模式,公司ESB产品引入Rest微服务服务机制过程,笔者刚好参与其中,其中Serverless作为一个新起的概念,跟微服务架构相关,为 ...
- 【redux】详解react/redux的服务端渲染:页面性能与SEO
亟待解决的疑问 为什么服务端渲染首屏渲染快?(对比客户端首屏渲染) react客户端渲染的一大痛点就是首屏渲染速度慢问题,因为react是一个单页面应用,大多数的资源需要在首次渲染前就加载 ...
- Python - 关于代码阅读的一些建议
初始能力 让阅读思路保持清晰连贯,主力关注在流程架构和逻辑实现上,不被语法.技巧和业务流程等频繁地阻碍和打断. 建议基本满足以下条件,再开始进行代码阅读: 具备一定的语言基础:熟悉基础语法,常用的函数 ...
- Axure安装、破解、汉化全套
最近公司准备使用敏捷开发流程,然后刚好需要Axure这个软件,就去找了些资源分享给大家,希望对大家有所帮助: 全套安装,破解,汉化下载地址: 链接: https://pan.baidu.com/s/1 ...
- js数组之sort排序的用法
sort排序 转载自:https://blog.csdn.net/idomyway/article/details/80544509 js中用方法sort()为数组排序.sort()方法有一个可选参数 ...
- [原创]K8mysqlCmd数据库免驱连接工具
无需机器安装MYSQL驱动,可用于内网渗透(如远控cmd下连接目标内网不可上网机器数据库) 当然目标机可代理出来的话,没必要使用该工具了 因为很多功能SQL语句需要自己打,很多人可能不懂 如果更新2. ...
- 【WebAPI No.1】创建简单的 .NETCore WebApi
介绍: 官方定义如下,强调两个关键点,即可以对接各种客户端(浏览器,移动设备),构建http服务的框架.Web API最重要的是可以构建面向各种客户端的服务. core的WebAPI与ASP.NET ...
- leetcode — climbing-stairs
/** * * Source : https://oj.leetcode.com/problems/climbing-stairs/ * * * You are climbing a stair ca ...
- leetcode — sqrtx
/** * Source : https://oj.leetcode.com/problems/sqrtx/ * * * Implement int sqrt(int x). * * Compute ...