摩登開發人員訓練營 – 投影片及範例程式下載及錄影

於2013/3/28-3/29 進行的摩登開發人員訓練營中,「Windows市集應用程式最佳實踐」這場次的投影片及範例程式可於 http://sdrv.ms/ZzMsuo 下載。

image

 

投影片同時可在SlideShare下載或線上觀看:

image

主題皆是以實作為主,包含以下這幾項:

•「分享」(Share Contract)

•「搜尋」(Search Contract)

•右側工具列 (Charms Bar)

•如何儲存使用者個人設定? (Roaming 應用)

•取得目前位置 (Geolocation)

•使用 WebView 的眉角

•取得及處理 JSON 資料

•其他:

–播放音樂或音效 (MediaElement)

–選取本地或需端檔案 (FilePicker)

–背景執行或下載 (Background Task/Transfer)

 

當天的課程內容錄影:

image 

程式碼下載- 將 Blogs 轉為 Windows 8 App

在”將部落格轉成 Windows Store App – 並加入「搜尋」功能”的文章中,你應該已經發現,只要有部落格的 Blog RSS/Atom feeds,就可以很快的完成一個 Windows Store App,您可在此下載程式碼 (Source code downoad)。

 

我透過此方法將個人目前的三個 Blogs 集結起來,也已成功上架: http://apps.microsoft.com/windows/zh-TW/app/raymond-tsais/646c20eb-601c-4479-8b2d-d64e9c7f5456:

image

 

若各位有興趣依此程式作實作的話,請注意以下幾點:

1. 如前文步驟一的說明,請在 FeedData.cs 的 GetFeedsAsync() 方法中,將您要訂閱的RSS/Atom 連結加入:

image

 

2. 請記得要修改 App Name 及 Display Name,尤其在 .appxmanefest 之中:

image

3. 由於這個 App 需要用到網際網路連線,若要成功上架到 Windows Store 上的話,就要加上隱私權聲明的連結,但在此範例檔中各位只要修改 App.xaml.cs 這個檔案,將以下連結改成您的連結即可:

image

若要了解更多隱私權聲明細節,可參考: 隱私權聲明-最常見的退件原因從無到有- 程式碼小於 50 行的 Windows Store App 開發及上架之旅 (程式供下載)

 

4. 最後請在其他功能,及排版、底色、Logos 等方面發揮你的創意喔!

將部落格轉成 Windows Store App – 並加入「搜尋」功能

以下這個分成五個部份的 step-by-step 文章,是個學習 Windows 8 App 開發很好的出發點;而文章的第五個部份: 建立部落格閱讀程式,則提供了開發者直接將某部落格轉成 Windows 8 App 的一條捷徑。
http://msdn.microsoft.com/zh-tw/library/windows/apps/hh974581.aspx 
image
 
本文的目的即是:
1. 修改 Sample Code 以讀取自訂的 Blogs RSS/Atom feeds
2. 加入Search contract 讓使用者能搜尋文章內文部落格標題
開始 Coding!
(若想直接觀看結果或下載程式碼請至: 程式碼下載- 將 Blogs 轉為 Windows 8 App)
1. 修改 Sample Code 以讀取自訂的 Blogs RSS/Atom feeds
首先至 Windows 8 App 範例程式集散地取得 Sample Code,另外有 JavaScript 版本可供下載,以下我則以 C# 為例作說明。
image
下載 C# Sample Code 並解壓完畢,以 Visual Studio 2012 打開 GettingStarted_CSTutorials.sln 後,先將 WindowsBlogReader 設為起始專案,然後按 F5 ,確認可正常編譯並能順利執行及開啟第一個畫面:
image
接下來就要把我們想訂閱的部落格加進去了!
首先當然要準備好某個部落格的 RSS/Atom feeds,舉例而言本站文章的 RSS 即為 http://blogs.msdn.com/b/mengtsai/rss.aspx
image
然後在 FeedData.cs 的 GetFeedsAsync() 方法中,將您要訂閱的RSS/Atom 連結加入:
image
就這樣! 我們已經完成本文章的第一個目的了! 微笑
以下是 run 起來的樣貌:
imageimage
接下來是重頭戲! 當您的 Blogs 數目及文章數眾多時,提供一個合適的搜尋功能就非常重要了:
2. 加入Search contract 讓使用者能搜尋文章內文部落格標題
要在您的 Windows Store App 加入 Search contract 有幾種不同的方式,其中一種描述在我的另一篇文章中,在這我介紹另一種方式,您只要三個步驟就能加入搜尋功能!
步驟一: 首先打開 Package.appxmanifest 檔案,並加入「搜尋」 (Search) 的宣告 (Declaration):
image 
步驟二: 現在要作的是,讓使用者能夠搜尋某部落格的文章內文 (Content),並將含有此搜尋字串的文章列出來。因為要搜尋文章內文,我們就先打開 SplitPage.xaml.cs 檔案,然後在 SplitPage 的 constructor 中加入一個 event handler,來接收使用者由 Charms bar->搜尋->鍵入字串->然後按 Enter 的動作:
    Windows.ApplicationModel.Search.SearchPane.GetForCurrentView().QuerySubmitted 
        += SplitPage_QuerySubmitted;
image
接下來我們要將 feedData 設為全域變數 (global variable), 這樣在 SplitPage_QuerySubmitted() 方法中才能存取到這個變數,因此我們在 SplitPage class 的第一行即宣告此變數,然後記得在 LoadState() 及 SaveState() 這兩個 methods 中拿掉 feedData 的宣告:

image

image

image

步驟三: 就是實作 SplitPage_QuerySubmitted()  方法了:
    void SplitPage_QuerySubmitted(
           Windows.ApplicationModel.Search.SearchPane sender, 
           Windows.ApplicationModel.Search.SearchPaneQuerySubmittedEventArgs args)
    {
        this.DefaultViewModel["Items"] = from dynamic item in feedData.Items
                                         where
                                         item.Content.Contains(args.QueryText)
                                         select item;
    }
您可以看到我是使用 LINQ 語法在 feedData.Items 的 Content 中,檢查是否有吻合使用者的搜尋字串 (arg.QueryText),然後透過 DefaultViewModel 作顯示,以下是 run 起來的畫面:

image

你可以想見,這個搜尋的功能可以進一步的延伸下去,只要修改 LINQ 語法,並在合適的 page 之中作修改即可。
舉例而言,假設我的部落格數目非常多,我想提供使用者搜尋部落格的標題 (Title) 的話,同樣是三個步驟如下:
步驟一: 打開 ItemsPage.xaml.cs 檔案,並在 ItemsPage() 的 constructor 之中加入一個 event hander :
  Windows.ApplicationModel.Search.SearchPane.GetForCurrentView().QuerySubmitted 
      += ItemsPage_QuerySubmitted;
步驟二: 將 feedDataSource 設為全域變數並在 LoadData() 中將宣告拿掉。

image

步驟三: 實作 ItemsPage_QuerySubmitted() 方法如下,您會注意到我修改了 LINQ statement ,改由在 feedDataSource.Feeds 中找尋 Title (標題):
    void ItemsPage_QuerySubmitted(
    Windows.ApplicationModel.Search.SearchPane sender,               
    Windows.ApplicationModel.Search.SearchPaneQuerySubmittedEventArgs args)
    {
       this.DefaultViewModel["Items"] = from dynamic item in feedDataSource.Feeds
                                        where
                                        item.Title.Contains(args.QueryText)
                                        select item;
    }
完成之後,搜尋部落格標題的結果如下:

image

We are done! 微笑
程�����碼下載 (Source Code download)