首先請各位看下面的圖。
相信微博的這個功能,大家不陌生吧。那麼它是怎麼實現的呢?
首先,我們要了解一個東西,應用程序協定,名稱不好理解,也很難翻譯,這樣吧,我們看看它是
在哪裏設置的,也許你會有點感悟。
用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("無法共享。");
記住,現在要以正常啓動方式運行一次共享目標程序,因爲這樣做,新的修改纔會生效。
報告錯誤後,就會收到上面的提示。