キャラクターが声で天気予報を教えてくれるアプリを作る
次に、ソリューション・エクスプローラー内の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回のサンプルプログラムです。