相信每一位 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概述

Behaviors SDK

UWP: 妙用自定义 Action 以简化并重用代码的更多相关文章

  1. UWP中实现自定义标题栏

    UWP中实现自定义标题栏 0x00 起因 在UWP开发中,有时候我们希望实现自定义标题栏,例如在标题栏中加入搜索框.按钮之类的控件.搜了下资料居然在一个日文网站找到了一篇介绍这个主题的文章: http ...

  2. 使用自定义tld标签简化jsp的繁琐操作

    最近做一个树形结构的展示,请求目标页面后,后台只返回简单的List,虽然有想过在jsp页面内做一些操作简化,但是太繁琐了,其他的标签又不能满足需求,所以只能自己做一个.使用tld标签可以简化jsp代码 ...

  3. Wix打包系列(三)自定义Action(Custom Action)

    原文:Wix打包系列(三)自定义Action(Custom Action) 3.1 关于Action 我们已经知道如何生成具有标准安装界面的安装程序了,Windows Installer按照我们的界面 ...

  4. struts 中自定义action访问方法

    struts中action类继承了ActionSupport  默认实现了execute()方法 struts.xml配置文件中 然后可以配置如下映射: <package name =" ...

  5. 使用DRF视图集时自定义action方法

    在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...

  6. Android自定义action与permission!!! (转)

    原文地址:http://blog.csdn.net/android_tutor/article/details/6310418#reply 大家好,今天给大家简单分享一下Android中自定义acti ...

  7. wxpython 支持python语法高亮的自定义文本框控件的代码

    在研发闲暇时间,把开发过程中比较重要的一些代码做个珍藏,下面的代码内容是关于wxpython 支持python语法高亮的自定义文本框控件的代码,应该是对大家也有用. import keywordimp ...

  8. 【图像处理】Haar Adaboost 检测自定义目标(视频车辆检测算法代码)

    阅读须知 本博客涉及到的资源: 正样本:http://download.csdn.net/detail/zhuangxiaobin/7326197 负样本:http://download.csdn.n ...

  9. 用xib自定义UITableViewCell的注意事项——重用

    问题的提出: 有时候我们经常需要自定义tableView的cell,当cell里面的布局较为复杂时往往舍弃纯代码的方式而改用xib的方式进行自定义.当我们用纯代码的方式布局cell时,往往会在cell ...

随机推荐

  1. 8.0.11版本的mysql更改root密码

  2. eclipse 导入包含子maven项目的maven项目时的正确方式(父子项目)

    eclipse 导入包含子maven项目的maven项目时的正确方式(父子项目) NO1 导入时依次选择 import > Maven > Existing Maven Projects ...

  3. 包建强的培训课程(11):iOS Runtime实战

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  4. zookeeper集群配置详细教程

      第一步:环境准备 环境 版本 说明 JDK 1.8 zookeeper运行所需 centos 7 操作系统 需要配置好JDK的环境变量 zookeeper-3.4.9.tar.gz 3.4.9 z ...

  5. Open-Source Cybersecurity Infrastructure

    https://www.linkedin.com/pulse/open-source-cybersecurity-infrastructure-adrian/ The increased maturi ...

  6. 【sql注入】简单实现二次注入

    [sql注入]简单实现二次注入 本文转自:i春秋社区 测试代码1:内容详情页面 [PHP] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 1 ...

  7. Android JNI 学习(六):Object Operations Api

    一.AllocObject jobjectAllocObject(JNIEnv *env, jclass clazz); 分配新 Java 对象而不调用该对象的任何构造函数.返回该对象的引用. cla ...

  8. Java核心技术卷一基础知识-第11章-异常、断言、日志和调试-读书笔记

    第11章 异常.断言.日志和调试 本章内容: * 处理错误 * 捕获异常 * 使用异常机制的技巧 * 使用断言 * 日志 * 调试技巧 * GUI程序排错技巧 * 使用调试器 11.1 处理错误 如果 ...

  9. Java学习笔记二:数据类型II

    GitHub代码练习地址:https://github.com/Neo-ML/JavaPractice/blob/master/Intpractice3.java 一  Java中的数据类型 Java ...

  10. 微信小程序的概要

    微信小程序的概要 学习小程序要了解一下什么事小程序,小程序开发前需要做哪些准备,微信小程序开发工具的使用,小程序中的目录结构解析,视图和渲染,事件. 小程序的配置详解,小程序的生命周期与app对象的使 ...