• 【Win 10 应用开发】共享目标(UWP)


    在开始吹牛之前,先给大伙伴们拜个年,祝各位身体健康、生活愉快、[码]到功成。

    -------------------------------------------------------------------------------

    今年春节老周没有去玩,远的不愿去,近的都去过了,虽然外面的大太阳那么娇媚,但仍不知道去哪儿玩,干脆不玩了。只要知足常乐,天天都是过年,是吧。

    今天老周就说一个比较不复杂的东东——共享目标,这玩意儿呢,其实与8.1的是一样的,也是,这个功能没必要改,所以SDK团队保留了8.1的API,不过,有个别地方要注意,某些API已被删除,或将来会删除,目的是简化代码。

    所谓共享目标,就是让我们的应用程序支持接收其他应用程序发送的共享数据,即数据接收者。而应用程序支持接收哪些数据,则由开发者来配置,比如咱们的程序支持接收字符串的共享数据,当其他程序进行共享时,我们的应用就会出现在共享应用列表中,用户只要选中我们的程序,所共享的数据就会发送到我们的程序中。

    在99.9998%的情形下,我们应该设计一个页面,专门用来接收或处理共享数据。这个处理界面用 Page 来定义较好,当然,你用任何UI元素都行,只要赋给Window.Content属性就行,不过,页面的妙处在于它在导航的过程中可以传递附加数据,这方便处理。故,用页面比较合理。

    好,下面咱们来弄一个支持接收图像数据的共享目标,图像是以流的形式传递过来的,我们取出来的是表示图像的流。

    首先,配置一下清单文件,请应用程序支持接收的数据的格式。切换到“声明”选项卡,添加一个共享目标,在右边的配置页在,找到“数据格式”,然后点下面的新建按钮,在文本框中填上支持的格式,每个格式都要独立填,有三种格式,你就新建三个项。

    这里我只用一个Bitmap就可以了,数据格式的名字,可以参考清单设计器上的说明。

    如果数据内容是文件,应该指定允许的文件类型,当然你可以选支持任何文件类型,但这样太不讲究,最好指定文件类型。

    最后保存并关闭清单文件即可。

    下面开始写代码,当我们的应用程序被激活时,其实会调用 Application 类的OnShareTargetActivated方法,并在方法参数中传入ShareOperation对象,通过它可以获取数据。

    因此,在App类中应该重写OnShareTargetActivated方法。

            protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
            {
                // 获取 ShareOperation 对象
                var sharOp = args.ShareOperation;
                // 显示处理页面
                Frame root = Window.Current.Content as Frame;
                if (root == null)
                {
                    root = new Frame();
                    Window.Current.Content = root;
                }
                root.Navigate(typeof(RecSharPage), sharOp);
    
                Window.Current.Activate();
            }

    这里我的做法是:导航到一个RecSharPage页面来处理,并把 ShareOperation 对象作为附加参数传过去,再在页面上接收这个对象实例。

    下面是处理页面的代码部分。

            ShareOperation shrOpration = null;
    
            protected override async void OnNavigatedTo(NavigationEventArgs e)
            {
                shrOpration = e.Parameter as ShareOperation;
    
                if (shrOpration == null)
                {
                    return;
                }
    
                // 获取数据
                if (shrOpration.Data.Contains(StandardDataFormats.Bitmap))
                {
                    var bmpstream = await shrOpration.Data.GetBitmapAsync();
                    BitmapImage bmp = new BitmapImage();
                    bmp.SetSource(await bmpstream.OpenReadAsync());
                    this.img.Source = bmp;
                }
            }

    重写 OnNavigatedTo 方法,可以获取导航时传递的参数。

    在取数据时,应该先检查一下数据包中是否包含你想要的数据格式,比如这样。

                if (shrOpration.Data.Contains(StandardDataFormats.Bitmap))
                {
                    ……
                }

    因为我现在要的是图像数据,所以先看看数据里面有没有图像数据,标准格式名字可以从 StandardDataFormats 类的静态属性中检索。

    我这里就简单一些,只是在UI上显示收到的图像,不做额外处理。

    重点来了,一定注意。在接收数据时,不需要调用ReportStarted、ReportDataRetrieved、ReportError这几个方法了,如果你调用它们,会发生异常,你直接接收数据就行了,现在已经简化了操作,这几个方法不必调用了。其实,你可以从它们的声明中看到信息的,如下图。

    在处理完成时,你需要调用 ReportCompleted 方法,这个不能少,因为这个方法会告诉系统,你的程序已经处理完共享数据了,这时候共享面板会关闭。

    我的示例是加了一个Button,单击button时就完成共享。

            private void OnClick(object sender, RoutedEventArgs e)
            {
                // 报告操作完成
                shrOpration?.ReportCompleted();
            }

    下面可以开始测试了,首先得部署或者运行本例子,然后你运行一个可以共享图像的程序进行分享,我们的示例就会出现在候选列表中,点击就可以接收。

    我之所以选择接收图像数据,是因为测试方便,你不用另外写一个程序去发送共享数据,因为系统有一个可以共享屏幕截图的功能。

    运行程序后,在任意系统界面下,按快捷键 Win + H,然后就可以打开共享面板,并可以共享当前截屏。

    然后,在这个列表下选择咱们的应用即可。

    点击下面的 确定 按钮,完成接收。

    通过上面讲述,你会发现,和8.1中使用共享目标是一样的,只是有几个API你注意不要去调用即可。

    示例源代码下载

  • 相关阅读:
    ExIco应用程序图标保存器1.0发布
    Object.defineProperty
    es6代理 proxy 学习
    node js学习记录
    css默认值列表
    关于 keyup keydown keypress
    转载一篇关于css选择器的,很透彻
    ......图片上传
    mimi
    css 开发心得
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/5186935.html
Copyright © 2020-2023  润新知