PR

キャラクターが声で天気予報を教えてくれるアプリを作る

2014年2月26日(水)
薬師寺 国安

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

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

リスト4 (MainWindow.xaml.vb)

Option Strict On

Imports Windows.UI.Popups

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

Imports System.Net.Http

‘ areaInfoクラス内に文字列型のareaプロパティを定義します。

Public Class areaInfo
  Public Property area As String
End Class
Public NotInheritable Class MainPage
  Inherits Page

‘ XML要素を表すXElementクラスのメンバー変数xmldocを宣言します。

 Dim xmldoc As XElement

‘ 天気予報の情報を取得するXMLのURIを格納するメンバー変数myUriを宣言します。

 Dim myUri As String

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

XElement.Loadメソッドでpref.xmlを読み込みます。文字列型の新しいリストであるprefListオブジェクトを作成します。

Descendantsメソッドで、全ての子孫要素の値を、変数resultに格納しながら、以下の処理を繰り返します。ptefListオブジェクトにAddメソッドで要素の内容を追加していきます。
prefComboBoxのItemsSourceプロパティにprefListオブジェクトを指定します。これでComboBox内に47都道府県が表示されます。

  Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    xmldoc = XElement.Load("pref.xml")
    Dim prefList As New List(Of String)
    For Each result In From c In xmldoc.Descendants("都道府県") Select c
      prefList.Add(result.Value)
    Next
    prefComboBox.ItemsSource = prefList
  End Sub

都道府県が選択された時の処理

文字列型変数xmlFileNameに、prefComboBoxから選択されたインデックスに+1した値を、01.xml、02.xml・・・・といった形式で格納しておきます。

メンバー変数myUriに

myUri = "http://www.drk7.jp/weather/xml/" & xmlFileName

と指定して、指定したxmlFileNameの天気予報のXMLを取得します。例えば、「北海道」ならxmlFileNameは「01.xml」となり、「沖縄県」なら「47.xml」となります。これには、「気象庁の天気予報をXMLで配信」のAPIを使用しています。下記のURLを参照してください。
> 気象庁の天気予報情報を XML で配信(drk7.jp)

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

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

areaInfoクラスの新しいリストであるmyAreaInfoオブジェクトを作成します。

Descendantsメソッドで全ての子孫要素内の値を変数resultに格納しながら、以下の処理を繰り返します。
areaInfoクラスのareaプロパティに要素の属性”id”の値を、AddメソッドでmyAreaInfoに追加していきます。GridView1のItemsSourceにmyAreaInfoを追加します。これで、選択した都道府県内の「地域」が表示されます。

都道府県で「北海道」を選択した場合は、図7のようなXMLが返されます。要素の属性”id”には地域名が設定されているのがわかります。

図7:北海道を選択して返される結果XMLの構造(クリックで拡大)
  Private Async Sub prefComboBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles prefComboBox.SelectionChanged
    Dim xmlFileName As String = (prefComboBox.SelectedIndex + 1).ToString("00") & ".xml"
    myUri = "http://www.drk7.jp/weather/xml/" & xmlFileName
    Dim myHttpClient As New HttpClient
    Dim resultXml As String = Await myHttpClient.GetStringAsync(myUri)
    Dim doc As XElement = XElement.Parse(resultXml)
    Dim myAreaInfo As New List(Of areaInfo)
    For Each result In From c In doc.Descendants("area") Select c
      myAreaInfo.Add(New areaInfo With {.area = result.Attribute("id").Value})
    Next
    GridView1.ItemsSource = myAreaInfo
  End Sub

GridViewに表示されている地域が選択された時の処理

[戻る]アイコンを表示状態にします。areaTextBlock内に「選択された地域の天気予報」と表示します。
myFrameを表示状態にします。都道府県選択のComboBoxは選択不可にします。
文字列変数mapsDataにメンバー変数myUriの値と、選択された「地域」の値をカンマで区切って格納します。

このmapsDataを引数にしてBingMapsPageに遷移します。

  Private Sub GridView1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles GridView1.SelectionChanged
    Try
      backBUtton.Visibility = Windows.UI.Xaml.Visibility.Visible
      areaTextBlock.Text = DirectCast(GridView1.SelectedItem, areaInfo).area & "の天気予報"
      myFrame.Visibility = Windows.UI.Xaml.Visibility.Visible
      prefComboBox.IsEnabled = False
      Dim mapsData As String = myUri & "," & DirectCast(GridView1.SelectedItem, areaInfo).area
      myFrame.Navigate(GetType(BingMapsPage), mapsData)
    Catch
      myFrame.Visibility = Windows.UI.Xaml.Visibility.Collapsed
      Exit Sub
    End Try
  End Sub

[戻る]アイコンがタップされた時の処理

[戻る]アイコンを非表示にします。地域名を表示していたTextBlockをクリアします。
myFrameを非表示にします。当道府県選択用のComboBoxの使用を可能にします。

  Private Sub backBUtton_Click(sender As Object, e As RoutedEventArgs) Handles backBUtton.Click
    backBUtton.Visibility = Windows.UI.Xaml.Visibility.Collapsed
    areaTextBlock.Text = String.Empty
    myFrame.Visibility = Windows.UI.Xaml.Visibility.Collapsed
    prefComboBox.IsEnabled = True
  End Sub
End Class
Think IT会員限定特典
  • キャラクター音声天気予報アプリのサンプル

    『Windows 8.1+Visual Studio 2013によるWindows ストア・アプリ開発実例集』 第8回のサンプルプログラムです。
薬師寺国安事務所

薬師寺国安事務所代表。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のWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

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