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



首先请各位看下面的图。

1.png
2.png

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

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

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

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

的信息。



[attach]223 3.png [/attach]


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

[attach] 4.png 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、打开清单文件,切换到“声明”选项卡,在下拉列表中选择“共享目标”,并单击

“添加”按钮。


5.png

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

6.png

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

7.png

保存,关闭清单文件。

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("无法共享。");
}

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

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

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

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

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

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

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

9.png

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

11.png


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


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

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

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

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

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

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

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

报告错误后,就会收到上面的提示。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值