延迟共享是啥呢,这么说吧,就是在应用程序打开共享面板选择共享目标时,不会设置要共享的数据,而是等到共享目标请求数据时,才会发送数据,而且,延迟操作可以在后台进行。

这样说似乎过于抽象,最好的诠释方法,还是通过实例对比来观察吧。

老周设计的示例解决方案包含三个项目,其中一个是共享目标,用来接收共享的文本内容,并把文本写入到一个.txt文件中,存放到“文档”库中。

另外两个项目是:一个是未延迟的共享行为,再一个是延迟共享行为。

下面来对比一下效果。

先看未延迟共享的操作,如下图。

因为我在发送数据前故意拖延了10秒钟,因此你会看到,打开共享面板后会显示“正在从XXXXX获取信息”的等待过程,而且需要等待数据设置完毕后,才会显示共享目标的选择列表。

然后,我们再来看看延迟共享是什么情况。

当我打开共享面板后,就会马上显示共享目标的选择列表,当我从中选择共享目标后,会激活目标应用,并且等到目标应用要读取共享的数据时,源应用才会设置数据共享的数据,所以,拖延的10秒钟是在目标应用被激活后才发生。

而且这个时候,就算你关闭了共享面板,数据仍然会在后台进行处理。然后打开“文档”目录,就会看到保存的文本文件了。

好,效果看完了。总结一下,正常共享是先发送共享数据,再显示共享目标列表,要是要共享的数据很大,就会使得共享面板出现延迟,此时如果你关闭共享面板,共享操作就会被取消。

而延迟共享则是先选择共享目标,而不发送共享数据,直到共享数据的接收者请求(读取)数据时才进行发送,即把共享数据的发送行为延后执行,此时,就算共享面板被关闭,共享目标应用也可以在后台接收数据。

延迟共享适合用于共享比较大的数据,比如视频。

下面就分别实现两种共享行为。

先看常规共享。

        public MainPage()
{
this.InitializeComponent(); DataTransferManager.GetForCurrentView().DataRequested += async (c, d) =>
{
DataRequest req = d.Request;
var def = req.GetDeferral();
await Task.Delay( * );
// 设置共享内容
req.Data.Properties.Title = "分享文本(未延迟)";
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High,
() => req.Data.SetText(txtInput.Text));
def.Complete();
};
}

这种方式相信各位都比较熟。先获取一个用于当前应用的DataTransferManager实例,然后响应 DataRequested 事件,当要进行共享时就会发生该事件(共享面板打开时)。然后当然是设置要共享的数据内容了。

延迟共享和常规共享相似。

        public MainPage()
{
this.InitializeComponent(); DataTransferManager.GetForCurrentView().DataRequested += (a, e) =>
{
DataRequest r = e.Request;
r.Data.Properties.Title = "共享文本(延迟)";
r.Data.SetDataProvider(StandardDataFormats.Text, new DataProviderHandler(OnSetDataDelay));
};
} private async void OnSetDataDelay(DataProviderRequest request)
{
var def = request.GetDeferral();
await Task.Delay( * ); //延迟
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () => request.SetData(txtInput.Text));
def.Complete();
}

与常规共享的差异在于,延迟共享在处理 DataRequested 事件时并不会马上设置要共享的数据,而是调用 DataPackage 例的 SetDataProvider 方法,然后向方法传递一个委托,数据发送操作会延迟到共享目标应用请求数据内容时才执行,委托实例所绑定的方法用来发送数据,打开共享面板时不会发送数据。

而打开共享面板的方式都相同,直接调用DataTransferManager类的ShowShareUI静态方法就可以了。在UWP应用中,应该这样做,因为 Win 10 右边沿向左滑动,打开的是通知中心,不是 Win 8 时的超级按钮。

当然,你也可以通过快捷键 Win + H 来打开共享面板。

好了,牛皮就不多吹,今天到此作罢。

示例源代码下载

【Win 10应用开发】延迟共享的更多相关文章

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

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

  2. 【Win 10 应用开发】导入.pfx证书

    这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...

  3. 【Win 10应用开发】认识一下UAP项目

    Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...

  4. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  5. 【Win 10应用开发】Adaptive磁贴模板的XML文档结构

    在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...

  6. 【Win 10 应用开发】RTM版的UAP项目解剖

    Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...

  7. 【Win 10 应用开发】在代码中加载文本资源

    记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...

  8. 【Win 10 应用开发】Toast通知激活应用——前台&后台

    老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...

  9. 【Win 10 应用开发】手写识别

    记得前面(忘了是哪天写的,反正是前些天,请用力点击这里观看)老周讲了一个14393新增的控件,可以很轻松地结合InkCanvas来完成涂鸦.其实,InkCanvas除了涂鸦外,另一个大用途是墨迹识别, ...

随机推荐

  1. NPM (node package manager) 入门 - 基础使用

    什么是npm ? npm 是 nodejs 的包管理和分发工具.它可以让 javascript 开发者能够更加轻松的共享代码和共用代码片段,并且通过 npm 管理你分享的代码也很方便快捷和简单. 截至 ...

  2. Java多线程基础学习(一)

    1. 创建线程    1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target ...

  3. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  4. 一步一步教你用CSS画爱心

    今天小颖给大家分享一个用CSS画的爱心,底下有代码和制作过程,希望对大家有所帮助. 第一步: 先画一个正方形.如图: <!DOCTYPE html> <html> <he ...

  5. 15个关于Chrome的开发必备小技巧[译]

    谷歌Chrome,是当前最流行且被众多web开发人员使用的浏览器.最快六周就更新发布一次以及伴随着它不断强大的开发组件,使得Chrome成为你必备的开发工具.例如,在线编辑CSS,console以及d ...

  6. [原] KVM 虚拟化原理探究(4)— 内存虚拟化

    KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...

  7. 【一起学OpenFoam】01 OpenFoam的优势

    CFD技术发展到今天,已经超过了大半个世纪了,已经涌现出非常多的CFD软件可供人们使用.通用商业CFD软件譬如Fluent.CFX.Star CCM+等在工业上得到了广泛的应用,另外一些专用的软件(如 ...

  8. 不要着急改代码,先想想--centos 6.8下编译安装tmux

    诸位读者新年好,2017开年第一篇博客,请允许我先问候一下看到这篇博客的诸位.写博客是我2017年定下的目标之一,希望我会坚持下去. 最近打算尝试一下tmux这个神器,于是有了这一篇关于思维方式的Bl ...

  9. [Unity3D]利用Raycast实现物体的选择与操作

    本文系作者原创 转载请注明出处 如果是一个2D的平面项目或者说需要在三维空间选择一个物体时(经常表现为抓取物件),我们需要用到Raycast事件 那么首先先说说什么是Raycast 按照字面上来理解的 ...

  10. POJ1743 Musical Theme [后缀数组]

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 27539   Accepted: 9290 De ...