次に、ソリューション・エクスプローラー内のBingMapsPage.xamlを展開して表示される、BingMapsPage.xaml.vbをダブルクリックしてリスト5のコードを記述します。
ロジックコードを記述する
リスト5 (BingMapsPage.xaml.vb)
01 | Imports System.Net.Http |
03 | ‘ Bing Mapsに関するクラスの含まれるBing.Maps名前空間を読み込みます。 |
08 | Imports Windows.UI.Popups |
10 | ‘ TenkiInfoクラス内に文字列型の「日付」、「天気」、「画像」、「最高気温」、「最低気温」プロパティを定義しておきます。 |
13 | Public Property 日付 As String |
14 | Public Property 天気 As String |
15 | Public Property 画像 As String |
16 | Public Property 最高気温 As String |
17 | Public Property 最低気温 As String |
19 | Public NotInheritable Class BingMapsPage |
22 | ‘ 選択した都道府県のURIを格納するメンバー変数myUriを宣言します。 |
24 | Private myUri As String |
26 | ‘ 「地域」のデータを格納するメンバー変数areaDataを宣言します。 |
28 | Private areaData As String |
30 | ‘ 緯度のデータを格納するmyLatitudeメンバー変数を宣言します。 |
32 | Private myLatitude As String |
34 | ‘ 経度のデータを格納するメンバー変数myLongitudeを宣言します。 |
36 | Private myLongitude As String |
38 | Private no As Integer = 0 |
40 | ‘ HttpClientクラス型のメンバー変数myHttpClientを宣言します。 |
42 | Private myHttpClient As HttpClient |
44 | Private resultXml As String |
46 | ‘ XML要素を表すXElementクラス型のメンバー変数xmldocを宣言します。 |
48 | Private xmldoc As XElement |
50 | ‘ 指定したコレクションに対する単純な反復処理をサポートする列挙子である、 |
51 | ‘ インターフェイス型のメンバー変数queryを宣言します。 |
53 | Private query As IEnumerable(Of System.Xml.Linq.XElement) |
55 | ‘ 新しいPushPinクラスのインスタンスである、myPinメンバー変数を宣言します。 |
57 | Private myPin As New Pushpin |
58 | Private myInfoCount As Integer |
60 | ‘ TextBlockクラス型のmyDateTextBlockとmyTenkiTextBlockメンバー変数を宣言します。 |
62 | Private myDateTextBlock As TextBlock |
63 | Private myTenkiTextBlock As TextBlock |
65 | ‘ Imageクラス型のメンバー変数myImageを宣言します。 |
67 | Private myImage As Image |
69 | ‘ TextBlockクラス型のメンバー変数、maxTextBlcokとminTextBlockを宣言します。 |
70 | ‘ 最高気温の値と最低気温の値が格納されます。 |
72 | Private maxTextBlock As TextBlock |
73 | Private minTextBlock As TextBlock |
75 | ‘ StackPaneクラス型のメンバー変数myTenkiStackPanelメンバー変数を宣言します。 |
77 | Private myTenkiStackPanel As StackPanel |
79 | ‘ Buttonクラス型のメンバー変数nextButtonとprevButtonメンバー変数を宣言します。 |
81 | Private nextButton As Button |
82 | Private prevButton As Button |
84 | ‘ キャラクターが読み上げる内容を格納するメンバー変数readingTenkiを宣言します。 |
86 | Private readingTenki As String |
ページがアクティブになった時の処理
MainPageから送られてきた値をe.Parameterで受け取ります。Object型であるため、DirectCastで文字列にキャストします。
送られてきたデータは都道府県のURIと地域名がカンマで区切られて送られてきていますので、Split関数で分解し、配列変数myDataに格納します。
メンバー変数myUriには、配列変数myData(0)の値を格納します。都道府県のURIが格納されます。
メンバー変数areaDataには、配列変数myData(1)の値を格納します。「地域名」が格納されます。
新しいHttpClientのインスタンスmyHttpClientオブジェクトを作成し、GetStringAsyncメソッドで、指定したURIにGET要求を送信し、非同期操作で応答本体を文字列として受け取り、メンバー変数resultXmlに格納します。
XElement.ParseメソッドでresultXmlの値を文字列として読み込みます。
要素の属性”id”がメンバー変数areaDataと同じである要素を選択するクエリを定義します。
PushPinの背景色を「Crimson」に指定し、枠線を「3」に枠線の色を「Navy」に指定しておきます。
メンバー変数myLatitudeに要素の子要素の値を格納します。
メンバー変数myLongitudeには要素の子要素の値を格納します。
これらXMLの構造については図7を参照してください。
myLatitudeやmyLongitudeの値が空であった場合は、警告メッセージを発して処理を抜けます。そうでない場合は、新しいLocationのインスタンスを作成し、myLatutudeとmyLonditudeで初期化し、変数myLocationで参照します。
MapLayer.SetPosition(myPin, myLocation)
と指定すると、指定した緯度、経度の位置にピンが立ちます。
myMapにmyPinオブジェクトを追加します。
SetViewメソッドでmyLocationの位置にズームインします。
TenkiInfoクラスの新しいリストであるmyTenkiInfoオブジェクトを作成します。
TenkiInfoクラスの「日付」プロパティに要素内にある要素の属性”date”の値を指定します。
「天気」プロパティには要素の値を、「画像」プロパティには
要素の値を、「最高気温」プロパティには、要素の子要素要素でインデックスが0の値を指定します。
「最低気温」プロパティには要素の子要素要素でインデックスが1の値を指定し、AddメソッドでmyTenkiInfoオブジェクトに追加します。
GridView1のItemsSourceプロパティにmyTenkiInfoオブジェクトを指定します。これでマウスの右クリックをすると、アプリケーションバー内に天気予報の一覧が表示されます。
ピンの位置に今日の天気予報を表示するDataShowタスクを実行します。
01 | Protected Overrides Async Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) |
03 | Dim getMapsData As String = DirectCast(e.Parameter, String) |
04 | Dim myData() As String = getMapsData.Split(CChar(",")) |
07 | myHttpClient = New HttpClient |
08 | resultXml = Await myHttpClient.GetStringAsync(myUri) |
09 | xmldoc = XElement.Parse(resultXml) |
10 | query = From c In xmldoc.Descendants("area") Where c.Attribute("id").Value.Equals(areaData) Select c |
12 | myPin.Background = New SolidColorBrush(Colors.Crimson) |
13 | myPin.BorderThickness = New Thickness(3) |
14 | myPin.BorderBrush = New SolidColorBrush(Colors.Navy) |
16 | myLatitude = query.Descendants("geo").Elements("lat").Value |
17 | myLongitude = query.Descendants("geo").Elements("long").Value |
18 | If myLatitude = String.Empty AndAlso myLongitude = String.Empty Then |
19 | Dim message = New MessageDialog("緯度、経度が設定されていませんので、表示できません。") |
20 | Await message.ShowAsync |
23 | Dim myLocation = New Location(CDbl(myLatitude), CDbl(myLongitude)) |
24 | MapLayer.SetPosition(myPin, myLocation) |
25 | myMap.Children.Add(myPin) |
26 | myMap.SetView(myLocation, 10) |
30 | Dim myTenkiInfo As New List(Of TenkiInfo) |
32 | For Each result In query |
33 | For Each result2 In result.Descendants("info") |
35 | .Add(New TenkiInfo With {.日付 = CStr(result2.Attributes("date").First), _ |
36 | .天気 = result2.Elements("weather").Value, _ |
37 | .画像 = result2.Elements("img").Value, _ |
38 | .最高気温 = result2.Elements("temperature").Elements("range")(0).Value & "℃", _ |
39 | .最低気温 = result2.Elements("temperature").Elements("range")(1).Value}) |
43 | GridView1.ItemsSource = myTenkiInfo |