5 分鐘讓您的 Windows Store App 具備「分享」(Share Contract) 功能

Windows 8 的一大特色: 由右側螢幕滑出來的 Charms Bar,大概是 Win8 平版電腦的使用者最常看到的畫面之一了:
image
其中,要在 Windows Store App 內實作「搜尋」(Search) 的功能,我已經在 “從無到有- 程式碼小於 50 行的 Windows Store App 開發及上架之旅 (程式供下載)” 以及 “將部落格轉成 Windows Store App (在 Blog Reader sample 中加入「搜尋」功能” 中簡單說明了兩種可以實行的方法。
今天的主題則是要說明如何將「分享」(Share) 的功能加到 Windows Store App之中,讓使用者可以將內容透過 Facebook, Email, Plurk, WordPress 等其他 Apps 分享出去。因為實際的 coding 實在太簡單了,所以先說明一下 Share Contract 的背景知識。
Windows Store App 可以「分享」出去的內容包括以下七種:
  • 純文字 (Plain Text)

  • 統一資源識別元 (URI)

  • HTML

  • 格式化文字

  • 點陣圖 (Bitmap)

  • 檔案

  • 開發人員定義的資料

你可以任意組合以上的幾種內容來作分享,比如你想分享一段純文字加上一個URI連結、或是想分享一張圖片;那麼可以接受這個組合的 Targeted Apps 就會出現在右方,讓使用者作選擇。
image
而以上的這七種內容,其實都是被包含在 DataPackage 這個物件之中,所以你可以看到 DataPackage 物件的所有 set* 方法其實就是在設定以上的七種內容:
image
除了要設定 DataPackage 這個物件之外,另一個要作的事是先取得 DataTransferManager 的目前執行個體,這個 DataTransferManager 個體會有一個 datarequested 事件,使用者點選分享時就會引發這個事件;也就是說,你只要在這個事件方法中,將 DataPackage 的七種內容作組合,你的工作就完畢了!
開始 Coding!
為方便起見,我直接拿”將部落格轉成 Windows Store App” 的這篇文章,最後完成的程式碼(按此下載)來作說明,並假設我們想分享的是其中一篇部落格文章的連結 (URI)。
第一步:因為我們想分享的是文章連結 (URI),所以我們打開 SplitPage.xaml.cs 檔來作修改。連結的資訊是存在 seletedItem: FeedItem 這個物件中,所以我們把它設為全域變數好在其他地方作處理,並記得在 LoadState() 方法中拿掉此變數的宣告。
         // 將 selectedItem 設為全域變數 global variable 
        FeedItem selectedItem;
image
在 LoadState() 拿掉變數宣告後的部份程式碼如下:
image
第二步:在 LoadState() 方法的最後,加入一個 event handler: OnDataRequested:
     // Register for DataRequested events
    DataTransferManager.GetForCurrentView().DataRequested <br>                    += OnDataRequested; 

image

同時在 SaveState() 方法的最後,移除這個OnDataRequested 的 event handler:
     // Deregister the DataRequested event handler
    DataTransferManager.GetForCurrentView().DataRequested <br>                    -= OnDataRequested; 
image
第三步:就是實作這個 onDataRequested() 了,其中我用到了 SetUri() 來設定 URI 連結:
     // 實作 OnDataRequested()
    void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
    {
        var dataPackage = args.Request.Data;
        dataPackage.Properties.Title = selectedItem.Title + " by " 
                                       + selectedItem.Author;
        dataPackage.Properties.Description = selectedItem.Content;
        dataPackage.SetUri(selectedItem.Link);
    }
這樣就完成囉!
你可以注意到,其中最關鍵的部份僅在於設定 DataPackage 這個物件而已 (第三步),之後 Windows 8 就會處理由使用者選擇分享、列出合適的 Target Apps,再將分享內享傳遞出去的所有過程了。以下是完成後的執行畫面:
image
imageimage
如果要了解更詳盡的分享機制及進一步的應用,可以閱讀以下文章:
- 分享與接收內容 (使用 JavaScript 和 HTML 的 Windows 市集應用程式) (Windows)  
- 快速入門:分享內容 (使用 C#/VB/C++ 和 XAML 的 Windows 市集應用程式) (Windows)
同時更多的 sample code 範例程式都可在以下找到:
Windows Store app samples (可以直接搜尋找到你想用的程式碼)