win8开发(10)——如何共享文本内容



首先请各位看下面的图。

 
 

相信微博的这个功能,大家不陌生吧。那么它是怎么实现的呢?

首先,我们要了解一个东西,应用程序协定,名称不好理解,也很难翻译,这样吧,我们看看它是

在哪里设置的,也许你会有点感悟。

用VS2012新建windows store应用后,你会看到项目中有个清单文件,用于配置与应用程序包相关

的信息。



[attach]223    [/attach]


双击打开它。
切换到“声明”选项卡

[attach]    220[/attach]

这就是应用程序协定,你可以理解为为你的应用程序声明多种启动方式,并作为特定的目标使用

,如上面图片中,新浪微博为什么可以在其它应用程序中启动,并且可以共享信息,这样,我们可以理解为应用程序之间数据的传递,而我们最常见的一种方式就是复制-粘贴,这是利用剪贴板作为载体实现应用程序之间 的数居共享。


如果还是觉得很抽象,那最好的办法就是用实例来说明,我们来模拟刚才新浪微博的功能,一个

解决方案我们需要建两个项目,一个是共享源,即发送共享数据的一方;另一个是共享目标,即接受共享数据的一方。


首先我们来实现共享源,即发送方。
1、启动VS,新建项目。
2、在MainPage.xaml中输入以下XAML代码。
     <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <StackPanel>
            <TextBox Name="txtContent" Height="285"/>
            <Button Margin="12,15,0,0" Content="共享" Click="onShare"/>
        </StackPanel>
    </Grid>

3、然后,我们要处理按钮的Click事件。
        private void onShare(object sender, RoutedEventArgs e)
        {
            DataTransferManager.ShowShareUI();
        }

ShowShareUI方法是静态的,可以直接调用,DataTransferManager位于命名空间

Windows.ApplicationModel.DataTransfer,发送共享数据正是通过它来完成。

那,什么时候设置我们要发送的数据呢?例如,现在我要共享目标共享一条文本信息,

设置数据是在DataTransferManager类的DataRequested事件中处理的。


通过GetForCurrentView方法获得DataTransferManager的实例,故在MainPage类

的构造函数加入以下代码。

        public MainPage()
        {
            this.InitializeComponent();
            DataTransferManager.GetForCurrentView().DataRequested += MainPage_DataRequested;
        }
4、处理DataRequested事件
        void MainPage_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
        {
            var defl = args.Request.GetDeferral();
            // 设置数据包
            DataPackage dp = new DataPackage();
            dp.Properties.Title = "共享文本";
            dp.Properties.Description = "分享一些字符串。";
            dp.SetText(txtContent.Text);
            args.Request.Data = dp;
            // 报告操作完成
            defl.Complete();
        }

OK,现在我要完成共享目标。

在解决方案资源管理器”解决方案节点上右击,在弹出菜单中依次选择“添加”->“新建项目”

,再建一个App,它就是数据的接收方。

1、打开清单文件,切换到“声明”选项卡,在下拉列表中选择“共享目标”,并单击

“添加”按钮。


 

在右面的面板中,找到“数据格式”节,单击“新增”按钮。

 

因为只需传递文本信息,因此,输入 Text 即可。

 

保存,关闭清单文件。

2、新建一个空白页,命名为SharedPage.xaml,XAML代码如下。
    <Grid Background="#FF0B4C81">
        <TextBlock Margin="10,15,0,0"
                   FontSize="28"
                   VerticalAlignment="Top"
                   HorizontalAlignment="Left"
                   x:Name="tbShareText"/>
    </Grid>


3、打开SharedPage.xaml.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.ApplicationModel.Core;
// “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkId=234238 上有介绍
namespace ShareTargetSample
{
    /// <summary>
    /// 可用于自身或导航至 Frame 内部的空白页。
    /// </summary>
    public sealed partial class SharedPage : Page
    {
        public SharedPage()
        {
            this.InitializeComponent();
        }
        /// <summary>
        /// 在此页将要在 Frame 中显示时进行调用。
        /// </summary>
        /// <param name="e">描述如何访问此页的事件数据。Parameter
        /// 属性通常用于配置页。</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            if (CoreApplication.Properties.ContainsKey("value"))
            {
                this.tbShareText.Text = CoreApplication.Properties["value"].ToString();
            }
        }
    }
}

我们并不是在该页面上取共享数据,该页只是负责显示。我们取得的共享数据保存在

CoreApplication.Properties集合中,该页面便从该集合中取得数据并显示。


4、打开App.xaml.cs

我们在App类中重写OnShareTargetActivated方法,如果应用程序由用户启动,

则调用OnLaunched方法,但如果是共享源调用导致应用程序启动,则调用

OnShareTargetActivated方法,这就是应用程序协定的作用。


        protected async override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
        {
            var opr = args.ShareOperation;
            // 开始取数据
            opr.ReportStarted();
            DataPackageView pv = opr.Data;
            if (pv.Contains(StandardDataFormats.Text))
            {
                CoreApplication.Properties["value"] = await pv.GetTextAsync();
            }
            opr.ReportDataRetrieved();
            Frame root = Window.Current.Content as Frame;
            if (root == null)
            {
                root = new Frame();
                root.Navigate(typeof(SharedPage));
            }
            Window.Current.Content = root;
            Window.Current.Activate();
            //opr.ReportCompleted();
            //opr.ReportError("无法共享。");
        }

好的,完成,但是,我们必须以正常启动运行一次共享目标程序,不然,它不会安装到

系统的应用列表中。在解决方案资源管理器中,选中共享目标项目,右击,选择“调试”-“启动新实例”。

待程序运行后,再把它结束,这时候,打开电脑设置(鼠标移到右上角或右

下角,从出现的侧边栏中点击“设置”,点击下方的“更多电脑设置”),选择“共享”,

这时我们看到,共享目标的共享功能已经打开。

这时我们看到,共享目标的共享功能已经打开。
 

现在,运行共享源项目,在页面上随便输入一些内容。点击共享按钮。

 

然后点击我们的应用程序,

 


这样,我们的共享目标示例程就接收到共享数据了。


还没完,大家可能注意,上面App.xaml.cs中,有两行代码我故意注释掉了,

现在我们看看分别取消这两行代码,会发生什么。

1、取消第一行
            opr.ReportCompleted();
            //opr.ReportError("无法共享。");

然后,按上面的方法运行,我们发现,共享目标一收到数据就退出了,对的,在共享目标中,

我们对接收的共享数据进行处理,处理完后,一旦调用ShareOperation的ReportCompleted

方法报告共享操作完成,那么共享目标程序就会自动退出。 

同样道理,注释掉第一行,取消第二行的注释,我们让它共享失败。
//opr.ReportCompleted();
            opr.ReportError("无法共享。");
记住,现在要以正常启动方式运行一次共享目标程序,因为这样做,新的修改才会生效。
 

报告错误后,就会收到上面的提示。

你可能感兴趣的:(win8开发(10)——如何共享文本内容)