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

次に、ソリューション・エクスプローラー内の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”には地域名が設定されているのがわかります。
  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回のサンプルプログラムです。



