博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UWP: 妙用自定义 Action 以简化并重用代码
阅读量:4649 次
发布时间:2019-06-09

本文共 4469 字,大约阅读时间需要 14 分钟。

    相信每一位 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    {        ///         /// 复制文本        ///         CopyText,        ///         /// 打电话        ///         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(0));                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 中添加如下代码,即可:

 

 

    注意其中的 TaskType,值表达复制文本, TextToBeCopied,通过绑定,它获取到文本框的值。因而,这个 Action 就可以完成指定的任务。

    理解了本文的思路,现在,你就可以把它改造成适合你的 CommonTaskAction。

    如果你有更好的建议或意见,请留言互相交流。

 

参考文章:

转载于:https://www.cnblogs.com/wpinfo/p/CustomActionTask.html

你可能感兴趣的文章
register_globals(全局变量注册开关)
查看>>
as3调用外部swf里的类的方法
查看>>
如何让 zend studio 10 识别 Phalcon语法并且进行语法提示
查看>>
任意阶幻方(魔方矩阵)C语言实现
查看>>
视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
查看>>
第五次作业
查看>>
织梦教程
查看>>
杭电多校 Harvest of Apples 莫队
查看>>
java 第11次作业:你能看懂就说明你理解了——this关键字
查看>>
C/C++心得-结构体
查看>>
函数名作为参数传递
查看>>
apt-get for ubuntu 工具简介
查看>>
数值计算算法-多项式插值算法的实现与分析
查看>>
day8-异常处理与网络编程
查看>>
Python基础-time and datetime
查看>>
Linux epoll 笔记(高并发事件处理机制)
查看>>
shell脚本练习01
查看>>
WPF图标拾取器
查看>>
通过取父级for循环的i来理解闭包,iife,匿名函数
查看>>
HDU 3374 String Problem
查看>>