パノラマページを作成する(後編)

2011年7月22日(金)
PROJECT KySS
01■ページが読み込まれた時の処理
02ListBox1に「場所」の一覧を表示するAddNameプロシージャを実行します。
03ListBox2に「曲名」の一覧を表示するAddSongTitleプロシージャを実行します。
04    Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
05      AddName()
06      AddSongTitle()
07  End Sub
08 
09■ListBox1に「場所」の一覧を表示する処理
10文字列型の新しいリストであるaddressNameを宣言します。
11ReadXmldocクラスのインスタンスmyReadXmldocでAddress関数を呼び出します。Descendantsメソッドで取得した<場所>要素のコレクションに対して、各要素を変数 result に格納しながら、AddメソッドでaddressNameリストに<場所>要素の内容を追加していきます。
12ListBox1のItemsSourceプロパティに「場所」の追加されたaddressNameオブジェクトを指定します。
13  Private Sub AddName()
14    Dim addressName As New List(Of String)
15    For Each result In From c In myReadXmldoc.Address.Descendants("場所") Select c
16      addressName.Add(result.Value)
17    Next
18    ListBox1.ItemsSource = addressName
19  End Sub
20 
21■ListBox2に「曲名」の一覧を表示する処理
22文字列型の新しいリストであるsongTitleを宣言します。
23ReadXmldocクラスのインスタンスmyReadXmldocでseiSong関数を呼び出します。Descendantsメソッドで取得した<Music>要素のコレクションに対して、各要素を変数 result に格納しながら、AddメソッドでsongTitleリストに<Music>要素の内容を追加していきます。
24ListBox2のItemsSourceプロパティに「曲名」の追加されたsongTitleオブジェクトを指定します。
25  Private Sub AddSongTitle()
26    Dim songTitle As New List(Of String)
27    For Each result In From c In myReadXmldoc.seiSong.Descendants("Music") Select c
28      songTitle.Add(result.Value)
29    Next
30    ListBox2.ItemsSource = songTitle
31  End Sub
32 
33■「場所」が選択された時の処理
34NavigationService.NavigateメソッドでBingMap.xamlに遷移します。UriKind.Relativeとし相対URIで指定します。その際、URL の最後に「? キーワード = 遷移先に渡す文字列」という形で引数を付けて、遷移先のページに文字データを渡しています。ここではIndexというキーワードにListBox1より選択された項目のインデックスを指定しています。
35  Private Sub ListBox1_SelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox1.SelectionChanged
36    Dim myIndex As String = ListBox1.SelectedIndex.ToString
37    NavigationService.Navigate(New Uri("/BingMap.xaml?Index=" & myIndex, UriKind.Relative))
38  End Sub
39 
40■「曲名」が選択された時の処理
41NavigationService.NavigateメソッドでseiSong.xamlに遷移します。UriKind.Relativeとし相対URIで指定します。その際、URL の最後に「? キーワード = 遷移先に渡す文字列」という形で引数を付けて、遷移先のページに文字データを渡しています。ここではIndexというキーワードにListBox2より選択された項目のインデックスを指定しています。
42  Private Sub ListBox2_SelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox2.SelectionChanged
43    Dim myIndex As String = ListBox2.SelectedIndex.ToString
44    NavigationService.Navigate(New Uri("/seiSong.xaml?Index=" & myIndex, UriKind.Relative))
45  End Sub
46End Class

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

リスト6 Mapに地図を表示する処理 (BingMaps.xaml.vb)

01Option Strict On
02Imports System.Xml.Linq
03 
04場所にアクセスできるクラスの含まれる、System.Device.Location名前空間をインポートしておきます。
05Imports System.Device.Location
06 
07Windows PhoneのためのBing Maps Silverlightクラスの含まれる、Microsoft.Phone.Controls.Maps名前空間をインポートしておきます。
08Imports Microsoft.Phone.Controls.Maps
09 
10Partial Public Class BingMaps
11  Inherits PhoneApplicationPage
12 
13~コード略~
14 
15ReadXmldocクラスの新しいインスタンスmyReadXmldocオブジェクトをメンバ変数として宣言します。
16  Dim myReadXmldoc As New ReadXmldoc
17 
18■画面の遷移で移動した時に最初に呼ばれるイベント
19ここで、MainPage.xamlから渡された文字データを受け取ります。文字データはNavigationContextのQueryStringにDictionary として提供されます。送信時のキーワード(この場合Index)を基に渡された文字列情報を、myParam(“Index”)として取得します。
20myParam(“Index”)の値を数値に変換して、変数Indexに格納します。
21ReadXmldocクラスのインスタンスmyReadXmldocでAddress関数を呼び出します。Descendantsメソッドで、変数Indexに該当する<場所>要素の値を取得し、変数myAddressに格納します。
22同じく、変数Indexに該当する<場所>要素の属性”緯度”の値を取得し、変数myLatitudeに格納します。
23同じく、変数Indexに該当する<場所>要素の属性”経度”の値を取得し、変数myLongitudeに格納します。
24x:NameがPageTitleというTextBlockにmyAddressの値を表示します。場所の名前が表示されます。
25地図を移動させるには、MapのCenterプロパティに、GeoCoordinateメソッドにダブル型の緯度と経度を引数で渡した値を指定します。Zoom Levelプロパティに10を指定します。ZoomLevelプロパティを指定しないと地図が表示されませんので注意してください。
26PushPinクラスの新しいインスタンスmyPinオブジェクトを生成します。Locationプロパティに、GeoCoordinateメソッドを使って緯度と経度を指定します。ContentプロパティにはmyAddress変数の値を指定します。ピン上に住所が表示されます。緯度と経度とContentの指定されたmyPinオブジェクトをAddメソッドでMapに追加します。これでピンが指定した位置に立ちます。
27  Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventArgs)
28    Dim myParam As IDictionary(Of String, String) = Me.NavigationContext.QueryString
29    Dim Index As Integer = Integer.Parse(myParam("Index"))
30    Dim myAddress As String = myReadXmldoc.Address.Descendants("場所")(Index).Value
31 
32    Dim myLatitude As String = myReadXmldoc.Address.Descendants("場所")(Index).Attribute("緯度").Value
33    Dim myLongitude As String = myReadXmldoc.Address.Descendants("場所")(Index).Attribute("経度").Value
34    PageTitle.Text = myAddress
35    Map1.Center = New GeoCoordinate(Double.Parse(myLatitude), Double.Parse(myLongitude))
36    Map1.ZoomLevel = 10
37 
38    Dim myPin As New Pushpin
39    myPin.Location = New GeoCoordinate(Double.Parse(myLatitude), Double.Parse(myLongitude))
40    myPin.Content = myAddress 
41    Map1.Children.Add(myPin)
42    MyBase.OnNavigatedTo(e)
43  End Sub
44 
45■エミュレーターのBack(←)ボタンのイベントを上書きする処理
46エミュレーターの持っている本来のBack処理を、e.Cancel=Trueで無効とします。
47NavigationService.NavigateメソッドでMainPage.xamlに遷移します。
48このBackボタンのイベントを上書きする処理を記述していないと、エミュレーターのBack(←)をクリックした際エラーが発生しますので、注意してください。
49Protected Overrides Subと入力すると、インテリセンス機能が働き、イベントの一覧が表示されますので、その中から選択してください。
50  Protected Overrides Sub OnBackKeyPress(ByVal e As System.ComponentModel.CancelEventArgs)
51    e.Cancel = True
52    NavigationService.Navigate(New Uri("/MainPage.xaml", UriKind.Relative))
53    MyBase.OnBackKeyPress(e)
54  End Sub
55 
56■[道路を表示中]ボタンをクリックした時の処理
57Button1のContextの値で条件分岐を行います。「道路を表示中」のボタンをクリックした場合は、MapのモードがAerialModeの「航空写真」モードになります。Buttonの文字が「航空写真」に変わります。
58「航空写真」のボタンをクリックした場合は、MapのモードがRoadModeの「道路表示」モードになります。Buttonの文字が「道路を表示中」に変わります。
59  Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
60    Select Case Button1.Content.ToString
61    Case "道路を表示中"
62      Map1.Mode = New AerialMode
63      Button1.Content = "航空写真"
64    Case "航空写真"
65      Map1.Mode = New RoadMode
66      Button1.Content = "道路を表示中"
67    End Select
68  End Sub
69End Class

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

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

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