【Win 10应用开发】延迟共享

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

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

老周设计的示例解决方案包含三个项目,其中一个是共享目标,用来接收共享的文本内容,并把文本写入到一个.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(10 * 1000);
                // 设置共享内容
                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(10 * 1000); //延迟
            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 来打开共享面板。

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

示例源代码下载

原文地址:https://www.cnblogs.com/tcjiaan/p/5192316.html