看到一篇眼前一亮的博文,是不是有一種希望其他小伙伴都能看到的感覺呢?有沒有一種“不轉不是程序員”的沖動呢?在 PC 瀏覽器上看到還好辦,直接網址復制,另一邊 IM 上就發過去了,但是如果是 App 中的內容,就沒這么方便了,總不能那邊 IM 上喊話:“隔壁老王,博客園上有篇叫‘博客園客戶端(Universal App)開發隨筆 – 為應用插上分享的翅膀’的博文超好看,要不你也瞅瞅?”。隔壁老王再去搜索就太麻煩了。可能你會說了,嗨,直接分享不就完了么。嗯,沒錯,就是分享功能。那么如何把分享功能引入我們的 App 中呢?往下看。
Universal App 中 Windows / Windows Phone 之間分享的異同
既然是 Universal App,那自然是共享一套分享的代碼啦。但是在這兩個之間還是有點不一樣的。區別在於,Windows 版由於有 Charm Bar 這個系統級的菜單,而這菜單里是自帶分享入口的,所以 Windows 版只需要提前准備好需要分享的內容,而不需要再提供另外的分享入口。而 Windows Phone 沒有這個入口,所以除了需要准備好內容,還需要通過菜單或按鈕的形式,顯式提供一個分享的入口。
不過隨着 Windows 10 的發布,Charm Bar 的壽命也走到了盡頭,在之前的 Technical Preview 中還是偶爾可以(誤觸)調出 Charm Bar 的,但是在剛剛發布的 Costumer Preview,我們應該就見不到 Charm Bar 的身影了,所有它提供的入口,都被移到了下圖所示的位置:
這一點倒是不難理解,因為所有的 App 都可以窗口化了,右滑調出 Charm Bar 的方法已經不好用,所以單獨提供一個入口。不過不得不說,這個入口的尺寸不是很適合點擊,而且呼出的菜單更是容易誤觸,尤其是在 Surface Pro 的高分屏上。這個改動,也使得原來上/下滑呼出 App Commands 的操作需要兩步才能完成,極為繁瑣。我們也因此不得不在新版的博客園中添加了 App Commands 的快捷入口。
另外,Windows 默認提供了兩種分享的方式,一是使用開發者提供的信息,二是直接分享當前屏幕截圖。而截至到目前的 Windows Phone Technical Preview 中,也是只有一種分享方式的,沒有截屏的選項。在 Windows Phone 中,我們還需要手動添加一個入口,如下圖所示。
創建分享(以 Text 舉例)
好了,我們以博客園的博文分享舉例,來介紹一下如何創建一個分享。
在動手之前,我們要先在腦海里想一下需要分享的內容。例如,博客園我們需要分享如下格式的信息(分割線以內):
--------------
標題:博文標題
作者:博文作者
摘要:博文摘要
博文鏈接
--------------
思路是這樣的,我們先創建一個字符串,包含以上信息,然后加入注冊到分享內容,最后顯式或系統調用出分享入口,進行分享。
具體實現如下:
首先添加引用:
using Windows.ApplicationModel.DataTransfer;
然后創建一個叫RegisterForShare的方法,將需要分享的內容注冊到分享區:
private void RegisterForShare() { DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView(); dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.ShareTextHandler); }
在這個方法里,我們創建了一個 DataTransferManager,並讓他在 DataRequested 事件時出發 ShareTextHandler 方法:
private void ShareTextHandler(DataTransferManager sender, DataRequestedEventArgs e) { DataRequest request = e.Request; request.Data.Properties.Title = loader.GetString("ShareTitlePrefixText") + this.post.Title; request.Data.Properties.Description = this.post.Summary; string summaryText = (this.post.Author != null ? loader.GetString("ShareContentAuthor") + this.post.Author.Name : "") + "\n" + loader.GetString("ShareContentSummary") + (this.post.Summary.Length > 50 ? this.post.Summary.Substring(0, 50) : this.post.Summary) + "\n" + this.post.Link.Href; request.Data.SetText(summaryText); }
接下來實現這個方法,創建一個 request,並完善其中的內容,其中 request.Data.Properties.Title 是會顯示在分享的標題部分的內容,例如如果是郵件分享,那么郵件標題就是 request.Data.Properties.Title,如果 Onenote 分享,那么 note 的標題也會是 request.Data.Properties.Title。request.Data.Properties.Description 不是必選項,僅僅是個備注參考,不會在分享時顯示出來。最后的 request.Data.SetText(summaryText); 將其余需要分享的內容設置好。這樣,我們的需要分享的內容就像之前想的一樣都已經填寫進去了。
接下來要做的,是先調用 RegisterForShare 方法,這個過程可以在構造函數中完成。
分享入口
如果是 Windows,那么在構造函數調用了 RegisterForShare 方法以后,就已經可以直接分享了,入口就是之前提到過的 Charm Bar 或 菜單:
右邊的下拉菜單,可以選擇分享內容或截屏:
我們選擇郵件分享內容
就可以發送了。
如果是 Windows Phone,那么我們還需要多做一步。
創建一個菜單的入口:
<AppBarButton x:Name="btn_Share" x:Uid="ShareBlogButton" Label="分享博文" Click="btn_Share_Click" Icon="ReShare"/>
然后在點擊的方法中,顯式調用分享入口:
private void btn_Share_Click(object sender, RoutedEventArgs e) { Windows.ApplicationModel.DataTransfer.DataTransferManager.ShowShareUI(); }
這樣,就會調出系統的分享入口:
由於是模擬器測試,所以沒有 MS Account,因此沒有郵件分享的入口。
我們選擇短信
就可以發送分享內容了。
其他分享格式
除了 SetText 來分享 text 格式的內容,我們還可以創建 HTML,WebLink 和 files 等內容。具體實現和 Text 大同小異,實現細節,可以參考:
Text:https://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh871372.aspx
WebLink: https://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh973056.aspx
HTML:https://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh973055.aspx
files:https://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh871371.aspx
總結
通過以上的介紹,我們可以用不多的代碼實現將我們喜歡的內容快速分享給他人的目的。我們再也不用擔心隔壁老王看不到我們給他們的分(sao)享(rao)了。
分享代碼,改變世界!
Windows Phone Store App link:
http://www.windowsphone.com/zh-cn/store/app/博客園-uap/500f08f0-5be8-4723-aff9-a397beee52fc
Windows Store App link:
http://apps.microsoft.com/windows/zh-cn/app/c76b99a0-9abd-4a4e-86f0-b29bfcc51059
GitHub open source link:
https://github.com/MS-UAP/cnblogs-UAP
MSDN Sample Code:
https://code.msdn.microsoft.com/CNBlogs-Client-Universal-477943ab