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(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 中添加如下代码,即可:

<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

时间: 2024-10-24 17:24:42

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

UWP: 妙用自定义 Action 以简化并重用代码

原文:UWP: 妙用自定义 Action 以简化并重用代码 相信每一位 App 开发者,在开发过程中,都会有一些代码被反复用到,比如:复制文本,打电话,发短信,发邮件,给应用添加评论等等.在项目之间复制这些代码段,实在不是一个好办法,所以大家可能会把这些代码放到一个类似 Utility 类中,或者一个库(Class Library)中,再加以调用.本文也是帮你完成同样的事情,不过本文是通过 Action 来完成.这两种方法的目的相同,区别是前者尽管实现了代码段封装,还是需要写代码(通常在 Vie

Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneGap.ionic.AngularJS这些框架或库的关系,我个人理解是这样,PhoneGap是一个商业项目,用来实现HTML5式的跨平台开发,后来Adobe公司将其中的核心代码开源,就是Cordova,Cordova只负责实现JavaScript调用原生代码的功能,是一个壳,而壳里具体用什么样式,在H

Windows10 UWP开发 - 响应式设计

Windows10 UWP开发 - 响应式设计 本篇随笔与大家简单讨论一下在开发适配不同分辨率.宽高比的Windows10 Universal App布局时的可行方式与小技巧.经验均从实践中总结,可能有诸多不完善和浅薄之处,欢迎读者严格指正.另外本文也只是抛砖引玉之用,希望能收获更多更好的实战经验. 自适配的必要性 说了这么多,我们首先可能会问了,为什么要做响应式设计?其原因有以下两点: Windows10的跨平台性 Windows10是微软宣称可以统一运行于PC&平板&手机&Xb

wex5 教程 自定义action与名称去重

有一个订单,需要取出不同的客户名称,且只显示一次名称.效果如下图: 一 思路:自定义action,用sql语句的group by分组,将名称返回前端,用list显示出来. 二 制作步骤: 1 新建service service作为后端服务分发接口,一个工程可以有多个service,一个service可以有多个action. 2  新建action action基本参数: 名称:自定义 实现:(指向 java方法) 格式为 Name.getName   其中Name为java类,首写字母必须为大写

Win 10 UWP开发系列:设置AppBarButton的图标

在WP8以前,页面最下面的四个小圆按钮是不支持绑定的,WP8.1 RT之后,系统按钮升级成了AppBarButton,并且支持绑定了.在Win10 UWP开发中,按钮的样式发生了变化,外面的圆圈没有了.不过个人还是更喜欢之前的圆按钮的样子^_^ 很喜欢Metro Studio这个程序,有数百个好看的按钮可以用,并且可以导出成png图片.但现在不建议采取png图片的方式了,主要是因为png在缩放后有可能会失真,最好使用字体.path等矢量的方式来实现.以下介绍几种设置AppBarButton图标的

Windows10(uwp)开发中的侧滑

还是在持续的开发一款Windows10的应用中,除了上篇博客讲讲我在Windows10(uwp)开发中遇到的一些坑,其实还有很多不完善的地方,比如(UIElement.Foreground).(GradientBrush.GradientStops)[1].(GradientStop.Offset)这种设置无法生效,还有RelativePanel内的元素不能自动的适应大小,要去手动控制宽高度,以及窗口在靠边的时候一些尺寸上的错误等等.虽然是WPF技术之后的延续,但是很多地方还是要小心仔细的处理,

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作)

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作) 一.简单说明 使用数据刷新框架: 该框架提供了两种刷新的方法,一个是使用block回调(存在循环引用问题,_ _weak),一个是使用调用. 问题:在进行下拉刷新之前,应该要清空之前的所有数据(在刷新数据这个方法中). 移除正在显示的cell: (1)把字典中的所有的值,都从屏幕上移除 (2)清除字典中的所有元素 (3)清除cell的frame,每个位置的cell的frame都要重新计算 (4)清除可复用的缓存池. 该部分的代码如下: 1

Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题

原文:Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题 最近在开发一个项目时,遇到了一个奇怪的问题,项目依赖的最低版本是10586,目标版本是14393,开发完毕发布到商店后,很多用户报无法正常加载页面.经查,有问题的都是Win10 10586版本. 我上篇博客中写到的自定义的AppBar控件,也存在这个问题,10586会报错. 为此特意下载了10586的SDK调试.错误显示,一个样式找不到,名为ListViewItemBackground.因为开发的时候是基于

基于Prism.Windows的UWP开发备忘

以前做UWP开发都是使用MvvmLight,主要是简单易上手,同时也写了很多MvvmLight的开发系列文章: UWP开发必备以及常用知识点总结 UWP开发之Mvvmlight实践九:基于MVVM的项目架构分享 UWP开发之Mvvmlight实践八:为什么事件注销处理要写在OnNavigatingFrom中 UWP开发之Mvvmlight实践七:如何查找设备(Mobile模拟器.实体手机.PC)中应用的Log等文件 UWP开发之Mvvmlight实践六:MissingMetadataExcept