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

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
  • キャラクター音声天気予報アプリのサンプル

    『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 Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

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

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