新时尚Windows8开发(10):如何共享文本内容
来源:互联网 发布:港澳直播软件 编辑:程序博客网 时间:2024/06/11 05:08
老周的博客http://blog.csdn.net/tcjiaan,转载请注明原作者和出处。
首先请各位看下面的图。
相信微博的这个功能,大家不陌生吧。那么它是怎么实现的呢?
首先,我们要了解一个东西,应用程序协定,名称不好理解,也很难翻译,这样吧,我们看看它是在哪里设置的,也许你会有点感悟。
用VS2012新建windows store应用后,你会看到项目中有个清单文件,用于配置与应用程序包相关的信息。
双击打开它。
切换到“声明”选项卡。
这就是应用程序协定,你可以理解为为你的应用程序声明多种启动方式,并作为特定的目标使用,如上面图片中,新浪微博为什么可以在其它应用程序中启动,并且可以共享信息,这样,我们可以理解为应用程序之间数据的传递,而我们最常见的一种方式就是复制-粘贴,这是利用剪贴板作为载体实现应用程序之间 的数居共享。
如果还是觉得很抽象,那最好的办法就是用实例来说明,我们来模拟刚才新浪微博的功能,一个解决方案我们需要建两个项目,一个是共享源,即发送共享数据的一方;另一个是共享目标,即接受共享数据的一方。
首先我们来实现共享源,即发送方。
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("无法共享。");
记住,现在要以正常启动方式运行一次共享目标程序,因为这样做,新的修改才会生效。
报告错误后,就会收到上面的提示。
- 新时尚Windows8开发(10):如何共享文本内容
- 新时尚Windows8开发(16):如何处理溢出文本
- 新时尚Windows8开发(11):共享目标示例
- 新时尚Windows8开发(24):文本呈现中的奥秘
- 新时尚Windows8开发(31):去掉文本中的HTML标记
- 新时尚Windows8开发(31):去掉文本中的HTML标记
- 新时尚Windows8开发(1):如何创建应用程序项目
- 新时尚Windows8开发(12):如何选择并打开文件
- 新时尚Windows8开发(13):如何选择保存文件
- 新时尚Windows8开发(14):如何选取联系人信息
- 新时尚Windows8开发(2):应用程序生命周期
- 新时尚Windows8开发(3):应用程序状态
- 新时尚Windows8开发(5):消息框
- 新时尚Windows8开发(6):资源 & 本地化
- 新时尚Windows8开发(20):FlipView控件
- 新时尚Windows8开发(21):分组视图
- 新时尚Windows8开发(25):缩放视图
- 新时尚Windows8开发(35):后台传输
- 回归自然
- 字符串单词反向输出程序
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除。
- 设计模式思想单例模式
- 对C语言进行调试的最好方法是什么?
- 新时尚Windows8开发(10):如何共享文本内容
- 关于C++ 构造函数调用构造函数的问题
- sqlserver日期时间函数处理
- 如何检测C语言中的内存漏洞(leak)?
- CS8900 base address的确定方法
- 什么是换码符(escape character)?
- 数据库的移植-同种数据库的移植
- 作为当代大学生,应该承担什么样的历史责任
- java技术支持 第二次 任务链接