[Windows 8.1] 升級Windows 8 App到Windows 8.1

本文章的內容來自2013/6月在舊金山舉行的BUILD 2013大會。
原始投影片及錄影檔請見: Upgrading Windows 8 apps to Windows 8.1
image
首先這堂課的內容是如何使用Visual Studio來針對既有的Windows 8 App升級為Windows 8.1的版本,無論是以XAML或HTML寫的Apps。但不涵蓋C++。
image
為何要升級我的Windows 8 App呢? 使用者由Windows 8升級為Windows 8.1之後,仍然能夠在Store中看到所有的 Windows 8 Apps;亦即,您已上架到Windows 8 市集中的Apps,在Windows 8.1的環境中仍然能被找到、被購買、也能完全相容且正確的執行。而且,若您的Apps升級到8.1之後,Windows 8的使用者即無法在Store中找到您的Apps。
所以,我們得先來衡量一下升級到8.1的好處,之後也會討論到是否要同時管理Windows 8 及Windows 8.1 版本的方法。
image
首先最重要的是,8.1在Apps的效能執行上作了非常大的改進! 在無需修改任何一行程式碼的情形下,只要retarget您的Apps到8.1,就可以感覺到效能上的大幅進步。
而您若使用了8.1的新功能,如 WinJS Scheduler, Dispose Model等的話,效能更能顯著提升、同時減少Working Set等記憶體使用量。
接下來是一段比較內建的Mail (郵件) App,在沒更改一行程式碼的情況下分別在Windows 8及Windows 8.1中執行起來的比較:
image
啟動速度較快(圖片先出來)
image
在ListView control 用手作快速的panning時,右側8.1的畫面不會有lag的情形。
image
其次,當然就是一些Windows 8.1的許多新功能了。(更多新功能的詳細說明請見BUILD 2013的錄影: https://channel9.msdn.com/Events/Build/2013)
image
而最後,也許也是最重要的,就是Windows 8.1重新改版的Store(市集)了,新的Store會特別精選具有8.1 新功能的Apps,增加您的Apps被使用者找到、下載的機會。
同時因為所有的Windows 8機器都可以免費升級到Windows 8.1,我們也預期會有許多的使用者願意直接升級。
image
請視App升級至8.1為讓您的Apps更好(better)的過程,而非只是單純的升級。
第一步驟即是regarteting您的Apps至8.1,重新編譯、執行、測試。
第二步驟是使用8.1的全新功能,讓您的Apps更好! 比如Search控制項在8.1中可以很好的利用。
第三步驟即是讓您的8.1 Apps上架Store。
image
OK 現在我有兩個不同版本的Apps了,要如何維護呢? 建議的作法是:
1. 在您所使用的Source Control軟體中,建立一個全新的分支(branch),這也是微軟內部的作法;或是
2. 拷貝整個solution再各自維護。
比較不建議的作法是維持一個單一的solution,然後在不同的projects中target到不同的Windows 版本。這種作法的缺點是,當有共用reference時,還得依據不同版本的reference給它不同的名稱,增加coding上的複雜度,也增加管理reference上的困難。
image
不同版本的Visual Studio 2013在開發及升級Windows Store Apps上的差異:
– Profession, Premium 及Ultimate版本:
1. 可以建立、編譯Windows 8.1專案
2. 可以升級Windows 8專案至Windows 8.1
3. 可以編譯Windows 8專案
– Express版本:
1. 可以建立、編譯Windows 8.1專案
2. 可以升級Windows 8專案至Windows 8.1 (但不能編譯Windows 8專案)
同時,Visual Studio 2012及Visual Studio 2013可以同時執行在同一台機器上!
image
現在來試一個Windows Blog Reader (XAML) App,這是在MSDN可以免費下載且附程式碼的範例程式
image
Visual Studio 2013 (Preview)開啟後會出現建議retarget到Windows8.1的提示,按了OK後並不會直接幫你升級。
image
你可以看到右側的各專案還是Windows 8的專案。我們可以按F5直接執行:
imageimage
看起來好像完全沒問題,但是在Windows 8.1中,使用者可以在此App所容許的最小寬度以上任意調整寬度。以下看到當使用者變換寬度時會看到有黑色留邊的現象:
image
好,接下來我們來試試升級至Windows 8.1:
image
image
image
看來是無痛升級成功了,執行之後會發現皆能正常執行,同時在使用者改變App寬度時不會有黑邊的情形發生:
image
雖然在此範例中能無痛升級,當然並非保證所有的Windows 8 Apps皆能如此輕易的完成升級,在retargeting的過程中會提示您閱讀一份文件,可以作為遇到問題時之參考。比如常見的問題是8.1使用了IE 11作為Web redering engine,這些都可能影響到相容性。
image
在另一個Windows Blogs Reader App的JavaScript版本中,也可以作同樣的升級,除了會發現在使用者改變Apps寬度時不會出現黑邊外,不同版本間的CSS會有些不同,但只要些微修改即可:
imageimage
說明至此各位已發現Windows Size是各位在升級時必需考量的重點之一。
在Windows 8中,有一個固定的Snapped View (320 pixels 寬)可讓使用者選擇。
image
而在Windows 8.1,使用者不但能在同一螢幕上同時執行最多4個Apps (包含Destop Apps),同時在寬度的選擇上也有更大的自由。
以下圖為例,中間的Weather Apps其最小的可能寬度為500 Pixels,以能完整的顯示其資訊,使用者可在此500 pixels以上的寬度間自由調整。而最右側的Reader List App,其最小則能縮至320 Pixels。
image
image
Windows 8.1再也沒有所謂的Filled View及Snapped View了!
新的作法是,所有的Apps的預設最小寬度是500 pixels,亦即使用者可以將您的App設為612, 700 pixels等寬度。而開發者則可以決定你的App的最小寬度至320 pixels。若設為320,使用者即可在320以上以至於螢幕的寬度間來更改你的App寬度。
App在執行時,使用者更改寬度後(手指離開螢幕時)會接收到一個event,開發者即可以據此event handler來設定layout。在這個步驟中,能取得Windows Size的資訊就很重要了。
以下是在manifest中設定最小寬度:
image
那到底要設多少呢? 這當然是取決於你的App是否能在某種寬度下仍能最佳顯示所要呈現的內容了。同時也要考慮到小幕尺寸的平版、以及在Portrait模式時,你的App能呈現的內容會是受限的,也需要將這些使用情境列入考量。
image
以下是HTML及XAML取得Windows Size & Orientation資訊的程式碼:
image
imageimage
image
image
image
好,假設您已經成功升級、實作了Windows 8.1的新功能並測試完畢之後,就準備好上傳您的App至Store了。
image
在您submit同一個App的過程之中,您會注意到只需要重新填寫Description (描述)、Features (新功能)及Screenshots (截圖),其他諸如App Name, Pricing, Website and support等都是相同的資訊,故不用重新填寫。
image
這裡有一個需注意的一點,同一個App若有Windows 8 及Windows 8.1的版本,則Windows 8的版本別(version numbers)不能超過8.1的版本。Visual Studio 2013會自動幫您解決或避開此問題。
好,我們來看看上傳介面吧!
image
你會看到可以在同一畫面中上傳Windows 8及Windows 8.1的package.
image
如前所述,您只要再填入Description (描述)、Features (新功能)及Screenshots (截圖)資訊即可。
延伸學習:
Beautiful Apps at Any Size on Any Screen
The fast lane for app certification
BUILD 2013 Channel 9

在註冊 Windows Store 帳號時卡住嗎? App 上傳很久還沒審核嗎? 怎麼我收到的錢不如我預期的多?

如果您有以上的疑問,或是在 Windows Store 上有任何註冊、開發、上傳、收費等其他問題,除了到論壇問問看是否已有解答之外,建議大家可直接到以下網站作詢問:

http://getsupport.microsoft.com

會得到微軟官方技術服務團隊的回答及支援!

 

有各種問題類型供選擇:

image

之後選擇類別,「應用程式提交和憑證」類:

image

「Windows 市集註冊和您的帳戶」類:

image

我個人最常使用的是使用 email 電子郵件,通常 24 小時內就會收到回覆。

image

與 Microsoft 對話交談 (類似 MSN 的方式,可以用中文喔!)

image:

 

以電子郵件詢問:

圖片1 

將 Semantic Zoom 加入格線 (Grid) 應用程式

SemanticZoom 控制項,可以讓使用者在兩個不同檢視 (GridView 或 ListView) 間切換。第一個會是內容的主要檢視,而第二個檢視雖與第一個檢視的內容相同,但是可以讓使用者能快速瀏覽其內容。例如,檢視通訊錄時,使用者可以放大字母,然後查看與該字母相關的名稱。

(圖片來源: http://ww1.prweb.com/prfiles/2012/06/05/9578381/Pinch-to-Zoom.png)

 

本篇文章的目的,是要在 Visual Studio 2012 內建的「格線應用程式 」(Grid App) 模版中,加入 Semantic Zoom 的功能。

 

我們先來了解一下 SemanticZoom 這個控制項的用法,在一個空白專案裡,把 SemanticZoom 拉到 Main.xaml 中來:

image

檢查一下所產生出來的 XAML 檔,可以看到它的結構很簡單,包含了兩種不同的檢視方法 (ZoomedInView 及 ZoomedIOutView),而每種檢視可以處理 GridView 或是 List View 控制項:

image

 

我們先來試一段簡單的程式來看看它是如何運作的,貼上以下的程式碼:

<SemanticZoom Grid.Row="1" Name="SemanticZoomData">

<SemanticZoom.ZoomedInView>

<ListView>

<ListViewItem>阿里山</ListViewItem>

<ListViewItem>陽明山</ListViewItem>

<ListViewItem>玉山</ListViewItem>

<ListViewItem>合歡山</ListViewItem>

</ListView>

</SemanticZoom.ZoomedInView>

<SemanticZoom.ZoomedOutView>

<ListView>

<ListViewItem>1</ListViewItem>

<ListViewItem>2</ListViewItem>

<ListViewItem>3</ListViewItem>

<ListViewItem>4</ListViewItem>

</ListView>

</SemanticZoom.ZoomedOutView>

</SemanticZoom>

執行的結果會如以下,使用者即可以在兩個 ListView 之間 Zoom in & out 來作切換:

image

當然以上的範例並沒有什麼實質意義,但能讓大家很快了解 SemanticZoom 的結構,及其可以產生的效果。

 

接下來,就要實際在 Vistual Studio 2012 內建的格線 (Grid) 應用程式模版中,加入 Semantic Zoom 的功能了。以下是我最後想呈現出來的效果:

image

 

1. 首先開啟「格線應用程式 (XAML)」 範本,並打開 GroupedItemsPage.xaml 檔: (之後所有的修改都僅發生在這個檔案之中)

image

GroupedItemsPage.xaml 檔:

image

 

2. 先來檢視一下此檔的 XAML 結構,利用左側 +, – 符號,我們可以看到此頁面的 UI 結構如下;其中的 GridView 檢視是我們要處理的部份。

image

 

3. 將 SemanticZoom 拉入後,複製一份 GridView 區塊,再分別放置於 ZoomedInView 及 ZoomedIOutView 的區段中: (這步驟非常重要,請特別注意其相對位置)

image

 

4. 由於我們是將原有的 GridView 全部複製,故需重新命名其中一個的 x:Name 值,否則會有 Compiler time error:

image

 

5. 請嘗試執行看看,您預期會有什麼結果呢? 由於兩個 GridView 是一模一樣的,所以你無論怎麼 Zoom in、Zoom out.看到的都會是兩個完全相同的檢視。

 

6. 接下來,我們就要修改其中的一個檢視囉! 由於我想作的是在第二個檢視裡,呈現 Group 名稱的大按鈕,所以我們先打開 ZoomedOutView 所處理的那個 GridView,找到 Button 區塊,新增/改變如下的幾項設定: (Margin 的間距設為30、Height="600" 、Background="BlueViolet" 及 VerticalAlignment="Center")

image

 

7. 再於同一個 GridView 的 ItemsPanelTemplate 區段中,加上 Visibility="Collapsed", 以令各個 Group 裡的 Item(s) 不要出現在畫面上:

image 

 

這樣就完成囉!

image

image

 

完整程式碼下載

Logo 製造機- 適用於Windows Store App 及 Windows Phone 8 App

之前曾介紹過一個 Metro Studio,可以來製作 Windows 8 App Logo,最近發現一個同樣免費、免安裝且操作更方便的工具,不但可以一次製作出適用於 Windows Store App 及 Windows Phone 8 App 的 Logo,還可以直接使

用既有的圖檔來製作。

 

檔案下載: http://bit.ly/storelogomaker (作者是日本微軟的員工)

 

操作方式超簡單! 下載解壓後,只要直接執行其 .exe 檔,然後將任一圖檔拉入中央:

image

接下來可以直接按下右上角那個「Save Icons」的按鈕,所有相對應的 Logo 圖檔就產生了! (您也可以選擇背景顏色或加框)

瀏覽一下所產生的圖檔,可以看到有各種尺寸的 Logos 供您使用:

image

以 Windows Store Apps 為例,預設是至少需要150×150 (標誌), 30×30 (小標誌), 50×50 (市集標誌) 及 620×300 (啟動顯示畫面) 等4種 Logos,而其預設檔名如以下:

image 

所以您可以在更改這些尺寸的檔名之後,一次拉入至 Assets 之中,所有的 Logos 就改動完畢了!

image

選擇全部套用:

image

搞定! 以下即是開始畫面中的樣貌:

image

[完全初學] 第一個 Windows Store App- 使用格線 (Grid) 應用程式

為了方便開發者能快速進入 Windows Store App 的開發,Visual Studio 2012 內建了二種模版 (templates): 格線(Grid)及分割(Split)應用程式。本篇文章將一步一步教導初學者能由此開發出一個簡單的 Windows Store App。

 

首先在 Visual Studio 2012 中「新增專案」並選擇「格線應用程式 (XAML)」:

image 

 

在還未作任何更動前,各位可以直接按 F5,或是選擇以「模擬器」方式嘗試執行:

image

 

執行結果如下,各位在畫面上會發現,這個模版含有一些 Group(s),而每個 Group 又包含了一些 Item(s):

image

 

點進 Group Title 的話可看到這個 Group 的說明:

image

 

再點入 Item:

image

 

接下來我們要作的事,就是將這些灰灰黑黑的圖片,以及如亂碼般的文字替換成我們想提供的資訊。所以我們到 Visual Studio 中的「方案總管」,打開 DataModel 下的 SampleDataSource.cs 檔案,基本上只要修改這個 SampleDataSource.cs 檔,即可改變所有的 Group 及 Item 內的所有文字及圖片。

image

 

找到 SampleDataSource(),各位可看到所有預設文字及圖片即來自此處:

image

 

我們以最簡單直覺的方式來改動它,先更改 group1 及其第一個 item 來看看成果:

image

 

在此我是以介紹阿里山景點為例,資料來源為阿里山國家風景區官網:

image 

在更動過程中有 3 點請注意:

1. 各個 Item(s) 的描述,預設是一個字串變數 ITEM_CONTENT,請逐一把它替換成您想要呈現的字串即可。如我以上的例子是把 ITEM_CONTENT 替換成:

@”大凍山脈嶺延伸緊臨於奮起湖聚落東方….”

image

 

2. 圖片的部份,可以直接使用圖片的網址連結。當然,您也可以另存為圖檔後,加入至 Assets 目錄下,然後再指定相對應的路徑及檔名 (ex: Assets/圖檔名-1.jpg)。

image

3. 我在各個字串的前方加上了‘@’,以處理逸出字元 (Escape character) 等。

 

執行看看吧! 首頁、第二層及第三層的畫面分別為:

image

image

image

依以上步驟,您就可以一步一步來填入所有 Group(s) 及 Item(s) 的資訊了。

 

Visual Studio 2012 預設的這個格線應用程式模版用了6 個 Groups,每個 Groups 有3~6個數量不等的 Items,各位如果有用不到的 Group(s) 或 Item(s),只要在前面加上註解符號 (//) 即可。

image 

如果要新增一個 Item 的話,以上面為例,只要把整個 group1.Items.Add 及至分號(;) 的整個 statement 複製至下方,然後記得把”Group-1-Item-5” 改為 “Group-1-Item-6” 即可。

 

實作至此,各位已將一個 App 的主要呈現內容完成了。當然,要成為一個完整且能上傳至 Windows Store 的 App,我們還得完成以下:

 

1. 更改 App 名稱,如改為「阿里山國家公園主題之旅賞析」: 打開 Package.appxmanifest 檔並更改「顯示名稱」及「描述」:

image

image

 

2. 更改 Page Title: 打開 GroupedItemsPage.xaml.cs 並於 GroupedItemsPage() 加上一行:

this.pageTitle.Text = "阿里山國家公園主題之旅賞析";
image

3. 更改背景 (非必須): 開啟某個 .xaml 檔 (如 GroupedItemsPage.xaml),在下方的 XAML 視窗中點選至 <GridView 的位置,然後在右側的「屬性」->「筆刷」-> Background ->在「單色筆刷」中透過調色盤選擇顏色。

image

 

4. 您應注意到我在以上是直接使用圖片的網址來顯示圖片,也就是此 App 需要用到網際網路 (Internet),故要上架 Windows Store 的話需提供隱私權宣告,詳細說明可見隱私權聲明-最常見的退件原因。在這您可直接實作如以下:

在 App.xaml.cs 檔中的 OnLaunched() 最後加上:

SettingsPane.GetForCurrentView().CommandsRequested += OnCommandsRequested;

然後加入以下兩個新方法即可:

private void OnCommandsRequested(SettingsPane sender, 

SettingsPaneCommandsRequestedEventArgs args)
{
    UICommandInvokedHandler handler =
             new UICommandInvokedHandler(onSettingsCommand);

    SettingsCommand privacy1Command =
             new SettingsCommand("privacystatementPage", "隱私權原則", handler);

    args.Request.ApplicationCommands.Add(privacy1Command);
}
async void onSettingsCommand(IUICommand command)
{
    SettingsCommand settingsCommand = (SettingsCommand)command;
    if (settingsCommand.Id.ToString().Equals("privacystatementPage"))
    {
        var success =
             await Windows.System.Launcher.LaunchUriAsync(
                    new Uri(@http://www.您的隱私權宣告網址.com));
    }
}

5. 加入 Share contract 的支援 (非必須)。比如您想在 Item 的頁面可以分享描述文字,則可在 ItemDetailPage.xaml.cs 檔中的 LoadState() 方法的最後加上:

try
{
    // Register for DataRequested events
    DataTransferManager.GetForCurrentView().DataRequested 

        += OnDataRequested;
 }
 catch (Exception) { }

然後加入以下這個新方法:

// 實作 OnDataRequested()
void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
    try
    {
       var dataPackage = args.Request.Data;
       dataPackage.Properties.Title = 
          ((SampleDataItem)this.flipView.SelectedItem).Title;
       dataPackage.Properties.Description = 
          ((SampleDataItem)this.flipView.SelectedItem).Subtitle;
       dataPackage.SetText(
          ((SampleDataItem)this.flipView.SelectedItem).Content.ToString()
          );
    }
    catch (Exception)
    { }
}

6. 最後,當然要製作專屬於此 App 的各種 Logo 圖檔了,各位可以參考Logo 製造機- 適用於Windows Store App 及 Windows Phone 8 App 以快速製作出 Logos.

 

完成了! 這樣的一個 App 就能在 https://appdev.microsoft.com/storeportals/zh-tw 中上傳了。

 

完整程式碼下載

Windows Store Dashboard 儀表板一覽

您的 Windows Store App 成功上架之後,就可以從「儀表板」(dashboard) 中查看 App 的各種狀態,如下載次數、使用方式、crash report、已賺了多少錢等等。

 

以下就以我的儀表板為例讓大家了解有哪些功能。

登入https://appdev.microsoft.com/storeportals/zh-tw/之後,首先看到的畫面會是所有進行中或已上架的應用程式:

image

 

已上架的應用程式:

image

 

點選已上架應用程式的「報告」,就會看到「應用程式摘要」;此頁面中可以看到這個 App 的下載、In-App Purchase、使用方式、評分、品質、財務的所有細節:

image

 

點選右上角「詳細資料」後都可以就各別項目展開,展開後還能選擇不同的時間週期(1個月、3個月、6個月、1年),以及市場、年齡或性別作套用。

「下載」可以看到每一天的下載次數:

image

image

 

透過「使用方式」了解使用者平均每一天花在你的 App 上多少分鐘:

image

 

「評分」可以了解使用者的評論,作為 App 改進的參考:

image

image

 

「品質」則可以看到 App 在被執行時,發生例外或損毀的狀況:

image

image

 

「財務」能看到此 App 收益及詳細交易記錄:

image

 

官方說明文件及進一步說明可參考: 分析您在 Windows 市集中的應用程式

在 Win8 App 中閱讀 PDF 或 XPS 文件

這篇文章中提到可以使用 Adobe 或是 Foxit 元件來閱讀 PDF 文件,但對一般開發者而言最大的難處是在 $$!! 是的,這兩家廠商提供的元件雖然功能豐富,但其價格也造成一般開發者的門檻。

 

好消息! 有一個可以免費使用的 WinRT 元件已在 Git 釋出!

 

原文說明在此:

Reading PDF and XPS on your Windows 8 application using WinRT (C#)

Reading PDF and XPS on your Windows 8 application using WinRT (JavaScript)

 

Git repo: http://git.ghostscript.com/?p=user/mvrhel/mupdf.git;a=summary

 

各位也可以直接下載其 Sample Code: http://www.catuhe.com/msdn/pdfreader.zip,將 PDF 文件呈現在 FlipView 讓使用者翻動:

 

也可以一次呈現2頁:

 

使用者Zoom in and ont,即可以看到 Vector PDF 的高解析度。

Optical zoom (bitmap based):

 

Vectorized zoom:

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

於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 

使用 JSON 及 Geolocation- 小於 50 行程式碼的 Windows Store App 又一番

我想寫個小 App ,首先是想抓取台北市政府資料開放平台 (http://data.taipei.gov.tw) 所提供的 JSON 資料,例如溫泉業者、停車場、各區運動中心等等,然後顯示選擇場所的附近地圖,進而取得由所在位置出發的路線規劃。

 

開始 coding! (此文所用程式碼在http://sdrv.ms/ZzMsuo,請自由下載使用)

 

我們先來看看台北市提供的「OK認證-游泳場所業」的資料如以下,可以看到「資料介接」的 JSON 連結為: http://data.taipei.gov.tw/opendata/apply/json/N0JCNzMwNEYtMkRDQi00ODNFLUIzQjMtN0E0ODM4RTU4NUUz ,此連結將被作為我的資料來源。

image

接下來打開 Visual Studio 2012,開啟一空白 Windows Store App 專案,打開 MainPage.xaml 並規劃介面如以下:

image

各位可以看到畫面左邊我拉了一個 ListBox 控制項,畫面右邊拉了一個 WebView,是準備用來呈現地圖的,同時右下角有個RadioButton group 及一個 Button 按鈕。

 

以下我實作了一個 GetJSON() 方法:

private async Task GetJSON()
{
     string strURI = "http://data.taipei.gov.tw/opendata/apply/json/N0JCNzMwNEYtMkRDQi00ODNFLUIzQjMtN0E0ODM4RTU4NUUz";
     var http = new HttpClient();
     http.MaxResponseContentBufferSize = Int32.MaxValue;
     var response = await http.GetStringAsync(strURI);

     JsonValue jsonValue = JsonValue.Parse(response.ToString());
     int arraySize = jsonValue.GetArray().Count;

     this.listArray = new string[arraySize];
     this.telArray = new string[arraySize];
     this.addrArray = new string[arraySize];

     for (int i = 0; i < arraySize; i++)
     {
          IJsonValue element = jsonValue.GetArray()[i];
          string strName = element.GetObject().GetNamedString("name");
          listArray[i] = strName;
          string strTel = element.GetObject().GetNamedString("tel");
          telArray[i] = strTel;
          string strAddr = element.GetObject().GetNamedString("poi_addr");
          addrArray[i] = strAddr;
     }
}

以上程式基本上作了兩件事:

1. 把 JSON 資料抓下來:各位可以看到我只用了一個 GetStringAsync() 方法就將資料抓取下來成為一個JSON字串。

2. 接下來是要處理所得到的 JSON 字串:在處理之前我們得先了解此 JSON 字串的結構,以此資料為例,會發現此JSON字串為一包含多個物件 (objects) 之陣列 (arrays),如以下:

image

了解資料結構後,就能參考使用 JavaScript 物件標記法這篇文章,如以上的程式碼,利用一個 for 迴圈讀取陣列中的所有物件,取得所需要的值;再於以下的 OnNavigatedTo() 方法中,將所有的游泳場所名塞入位於畫面左側的 ListView:

protected async override void OnNavigatedTo(NavigationEventArgs e)
{
     await GetJSON();
     for (int i = 0; i < listArray.Length; i++)
     {
          listBox1.Items.Add(listArray[i].ToString());
     }
     // Register for DataRequested events
     DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested;
}

在此請注意,GetJSON() 方法中因為至少呼叫一個非同步方法(即 GetStringAsync()),所以在方法的宣告前要加一個 async ;同時在呼叫此 GetJSON() 方法之前得加上一個 await 的關鍵字。 (這部份可參考: 使用 Async 和 Await 設計非同步程式)

跑起來會長得像這樣:

image

接下來是實作當使用者點選 ListView 裡的游泳場所後,會在右邊的 WebView 中呈現 選取所在地的 Google 地圖 (透過URI string的方式):

private void listBox1_Tapped_1(object sender, TappedRoutedEventArgs e)
{
      strSelectedList = listBox1.SelectedValue.ToString();
      strSelectedAddress = addrArray[listBox1.SelectedIndex].ToString();
      strSelectedTel = telArray[listBox1.SelectedIndex].ToString();


      webView.Source = new Uri(Uri.EscapeUriString
("https://maps.google.com/?output=embed&num=1&saddr=" + strSelectedAddress));

      listName.Text = strSelectedList;
      listTel.Text = strSelectedTel;
      listAddr.Text = strSelectedAddress;
}

使用者點選後就會長得像這樣:

image

最後,我想讓使用者能看到由目前所在位置到選取地點的規劃路線,所以實作右下角的 Button 按鈕程式如下:

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
     if (strSelectedAddress.Length > 0)
     {
          if (geo == null)
          {
               geo = new Geolocator();
          }
          try
          {
               Geoposition pos = await geo.GetGeopositionAsync();
               string strSADDR = pos.Coordinate.Latitude.ToString() + "," + 

                                 pos.Coordinate.Longitude.ToString();
               webView.Source = new Uri(Uri.EscapeUriString(
                                 "https://maps.google.com/?num=1&saddr=" + 

                                 strSADDR + "&daddr=" + strSelectedAddress + 
                                 "&dirflg=" + strDirFlg));
          }
          catch (Exception)
          {
               new Windows.UI.Popups.MessageDialog(

            "您的機器沒有定位服務(GPS)或目前服務是關閉的,請透過「設定」快速鍵重新開啟。 

            nYour location services are currently turned off. 
            Use the Settings charm to turn them back on.").ShowAsync();
           }
      }
}

各位可以看到我首先取得目前所在位置的經緯度,是透過 Geolocator.GetGeopositionAsync() 這個方法來取得;接下來只是再度重組一個 URI string,透過Google Maps 規劃路線即可。取得目前所在位置細節另可參考這篇文章

 

實作之後的執行畫面:

image  

程式碼: http://sdrv.ms/ZzMsuo

 

附註: 台灣目前一些公開資訊開放平台: 行政院農委會開放資料平台台北市政府新北市政府台中市台南市教育局文化部臺灣中央政府的資料入口網站「data.gov.tw 」