世界の観光地情報を眺めるサンプルプログラム

2013年6月14日(金)
薬師寺 国安

次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト3のコードを記述します。

ロジックコードを記述する

リスト3 (MainWindow.xaml.vb)

Option Strict On

最新の HTTP アプリケーション用のプログラミングインターフェイスを提供するクラスの含まれる、System.Net.Http名前空間をインポートします。

Imports System.Net.Http

TouristInfoクラス内に文字列型のname、title、description、urlプロパティを定義しておきます。

Public Class TouristInfo
  Property name As String
  Property title As String
  Property description As String
  Property url As String
End Class

Public NotInheritable Class MainPage
  Inherits Page<

リクルートより取得したキーで定数メンバ変数ApiKeyを初期化しておきます。APIキーは下記のURLより「新規登録」でメールアドレスを入力して送ると、リクルートよりキーが送られてきますので、それを使用します。
→ http://webservice.recruit.co.jp/ab-road/reference.html

ConstApiKey As String = "リクルートより取得したキー"
 Dim countryName As String

コンボボックスより地域が選択された時の処理

ComboBoxより選択された値をComboBoxItemにキャストし、Contentプロパティで取得した値を文字列に変換して変数areaNameに格納します。
変数areaNameの値で条件分岐を行います。
それぞれの地域の名前で変数countryNameにエリアコードを格納します。

変数myUrlに

String.Format("http://webservice.recruit.co.jp/ab-road/spot/v1/?key={0}&area={1}&count=100&format=xml", ApiKey, countryName)

と指定して、引数keyにリクルートより取得したApiKeyを指定し、areaに変数countryName変数の値を指定します。このクエリで返される結果XMLは図5のような構造です。赤い下線部分の要素の値を使用します。

図5:結果XMLの構造(クリックで拡大)

新しいHttpClientのインスタンスmyHttpClientオブジェクトを作成します。
GetFileAsyncメソッドで、指定URIにGET要求を送信し、非同期操作で応答本体を文字列として取得し、変数myResultに格納します。

ルート要素に名前空間が付加されているため、読み込む際の邪魔になりますので、Replace関数でに置換します。

XElement.Parseメソッドで変数myResultの内容を文字列として読み込みます。

TouristInfoクラス型のリストであるmyTouristInfoオブジェクトを作成します。
Descendantsメソッドで全ての子孫要素に対して、変数resultで要素の内容を取得しながら反復処理を行います。

TouristInfoクラスのnameプロパティに要素の値を、titleプロパティに要素の値を、descriptionプロパティに<description>要素の値を、urlプロパティに<url>要素の値を指定して、AddメソッドでmyTouristInfoオブジェクトに追加していきます。<br /> GridViewのItemsSourceプロパティに変数myTouristInfoオブジェクト値を指定します。これでタイルの中にname、title、descriptionの内容が表示されます。TitleTextBlockにComboBoxより選択した地域名を「の観光地」という文字列と連結して表示します。</url></description>

  Private Async Sub ComboBox1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboBox1.SelectionChanged

    Dim areaName = DirectCast(ComboBox1.SelectedItem, ComboBoxItem).Content.ToString
    Select Case areaName
    
      Case "アジア"
        countryName = "AAS"
      Case "ビーチリゾート"
        countryName = "BCH"
      Case "ハワイ"
        countryName = "HWI"
      Case "ヨーロッパ"
        countryName = "EUR"
      Case "アメリカ"
        countryName = "DUS"
      Case "オセアニア"
        countryName = "FOC"
      Case "アフリカ・その他"
        countryName = "CAF"
    End Select
 
    Dim myUrl = String.Format("http://webservice.recruit.co.jp/ab-road/spot/v1/?key={0}&area={1}&count=100&format=xml", ApiKey, countryName)
    Dim myHttpClient As New HttpClient
    Dim myResult As String = Await myHttpClient.GetStringAsync(myUrl)
    myResult = myResult.Replace("<results xmlns=" &ChrW(34) & "http://webservice.recruit.co.jp/ab-road/" &ChrW(34) & ">", "<results>")
    Dim xmldoc As XElement = XElement.Parse(myResult)
 
    Dim myTouristInfo As New List(Of TouristInfo)
    For Each result In From c In xmldoc.Descendants("spot") Select c
      With myTouristInfo
        .Add(New TouristInfo With {.name = result.Element("name").Value, .title = result.Element("title").Value, .description = result.Element("description").Value, .url = result.Element("url").Value})
      End With
    Next
    GridView1.ItemsSource = myTouristInfo
    TitleTextBlock.Text = areaName& "の観光地"
  End Sub

GridViewの項目が選択された時の処理

Frameを表示状態にします。
ComboBoxを選択不可とします。
変数myUrlにGridViewから選択された項目を、TouristInfoクラスにキャストして、そのurlプロパティの値を取得し格納します。

変数myUrlの値を引数にWebBrowserPageに遷移します。

例外が発生した場合は、ComboBoxの選択を可能にし、Frameを非表示とします。

  Private Sub GridView1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles GridView1.SelectionChanged
    Try
      myFrame.Visibility = Windows.UI.Xaml.Visibility.Visible
      ComboBox1.IsEnabled = False
      Dim myUrl As String = DirectCast(GridView1.SelectedItem, TouristInfo).url
      myFrame.Navigate(GetType(WebBrowserPage), myUrl)
    Catch
      ComboBox1.IsEnabled = True
      myFrame.Visibility = Windows.UI.Xaml.Visibility.Collapsed
    End Try
  End Sub

戻る(←)アイコンがタップされた時の処理

ComboBoxの使用を可能とし、Frameを非表示にします。

  Private Sub backButton_Click(sender As Object, e As RoutedEventArgs) Handles backButton.Click
    ComboBox1.IsEnabled = True
    myFrame.Visibility = Windows.UI.Xaml.Visibility.Collapsed
  End Sub
End Class

次に、ソリューションエクスプローラー内のWebBrowserPage.xamlを展開して表示される、WebBrowserPage.xaml.vbをダブルクリックしてリスト4のコードを記述します。

ロジックコードを記述する

リスト4 (WebBrowserPage.xaml.vb)

Option Strict On
Public NotInheritable Class WebBrowserPage
  Inherits Page

ページがアクティブになった時の処理

MainPage.xamlから渡された引数(myUrl)は、e.Parameterで取得できます。これはObject型であるため、DirectCastでString型にキャストして、変数myUriに格納します。

WebBrowserのSourceプロパティにmyUriの値を指定します。これでWebBrowser内に、該当する観光地の情報が表示されます。

  Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    Dim myUri As String = DirectCast(e.Parameter, String)
    WebBrowser1.Source = New Uri(myUri, UriKind.Absolute)
  End Sub
End Class

今回でこの連載は終了です。長い間おつきあいありがとうました。
次回の連載も、ぜひ楽しみに待っていてくだされば嬉しいです。

筆者からのお知らせ

筆者はWindowsストアでアプリを公開しています。チャームの検索からWindowsストアを選択して、検索欄に、kuniyasuまたはYakushijiKuniyasuと入力すると、公開されているアプリの一覧が表示されます。上記はどちらも私のアカウントですので、興味のある方は是非ダウンロードして使ってみてください。

  • 世界の観光地を表示・検索するプログラム

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています