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 

報告錯誤後,就會收到上面的提示。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章