ロジックコードを記述する
次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト2のコードを記述します。
ロジックコードを記述する
リスト2 (MainWindow.xaml.vb)
Option Strict On
Bing Mapsに関するクラスの含まれるBing.Maps名前空間をインポートします。
Imports Bing.Maps
コアシステムの機能とその UI についてのランタイム情報にアクセスするアプリケーションを提供するクラスの含まれる、Windows.UI名前空間をインポートします。地図上に表示するピンの背景色を指定する場合等に、この名前空間に含まれるクラスを使用します。
Imports Windows.UI
Public NotInheritable Class MainPage
Inherits Page
Dim zIndexNo As Integer = 0
Bing Maps上のどのピンがタップされたかを判別する、1ずつ加算されるメンバ変数Indexを宣言します。
Dim Index As Integer = 0
XMLを表すメンバ変数xmldocを宣言します。
Dim xmldoc As XElement
ページがアクティブになった時の処理
地図の拡大レベルを8に指定しておきます。
XElement.LoadメソッドでXML文書ファイル(Michitom.xml)を読み込みます。
Descendantsメソッドですべての子孫要素であるに対して、要素を変数resultに格納しながら、反復処理を行います。
変数myLatitudeにの属性”緯度”の値を格納します。
変数myLongitudeにの属性”経度”の値を格納します。
変数numberにの属性”番号”の値を格納します。
新しいPushPinクラスのインスタンス、myPinオブジェクトを作成します。背景色にCrimsonを指定し、Textプロパティに変数numberの値(札所の番号)を指定します。
MapのCenterプロパティにDouble型に変換したmyLatitude(緯度)とmyLongitude(経度)の値を指定します。
新しいStackPanelのインスタンスmyStackPanelオブジェクトを作成します。SetValueメソッドのZIndexPropertyに1ずつ加算されるzIndexNoの値を指定します。StackPanelがPushPinよりも前面に表示されます。
myStackPanelオブジェクトの背景色にPinkを指定します。初期状態ではmyStackPanelオブジェクトを非表示としておきます。
次に、TextBlockの新しいインスタンスmyTextBlockオブジェクトを作成します。パディングに5を指定し、Textプロパティに改行を含めた、「札所番号」とお寺の名前、「所在地」を指定します。文字色はNavyで、文字サイズは20とします。
Buttonの新しいインスタンスmyButtonオブジェクトを作成します。背景色にNavy、ボタンの表面の文字に「検索」と指定します。Tagプロパティには1ずつ加算されるIndexの値を文字列に変換して指定します。このTagの値は、どのPushPinがタップされたかを判別するのに使用します。
myStackPanelオブジェクトにmyTextBlockオブジェクトを追加します。
同様にmyStackPanelオブジェクトにmyButtonオブジェクトを追加します。
MapLayerクラスのSetPositionメソッドで、マップレイヤー内に要素の位置を設定します。この場合、myLatitudeとmyLongitudeの位置にmyStackPaneオブジェクトをセットします。MapLayerクラスは、地図上の要素の位置を保持しているマップレイヤーを表すクラスです。
MapにAddメソッドでmyStackPanelオブジェクトを追加します。
MapLayerクラスのSetPositionメソッドで、myLatitudeとmyLongitudeの位置にmyPinオブジェクトをセットします。
変数Indexを1ずつ加算します。
AddHandlerステートメントで、ボタンがクリックされた時のイベントハンドラを追加します。イベントハンドラ内では以下の処理を行います。
Buttonの情報を持っているmySenderオブジェクトをButtonにキャストして、Tagプロパティの値を取得します。取得した値を変数myIndexに格納します。数値に変換したmyIndexを変数_Indexに格納します。
変数_Indexに対応する要素の内容(お寺の名前)を取得し、変数myTempleに格納します。Bing 検索Uriの引数にmyTempleの値を指定して、新しいUriを初期化し、myUriオブジェクトを作成します。
Windows.System.Launcher.LaunchUriAsynメソッドを使用して、指定された URI を既定
のハンドラーで起動します。Bingが起動して、指定したお寺名を検索して表示します。
*)このWindows.System.Launcher.LaunchUriAsynメソッドを使用したアプリは、ストアに申請した際、「認定の要件」の「2.4 アプリで提供されるプライマリ エクスペリエンスはアプリ内で行われなければならない」の項目にひっかかりリジェクトをされることがあります。Webブラウザーを開くことで価値を提供していると判断されるからです。
しかし、ここ最近の筆者が申請した、ほとんどのアプリに、この
Windows.System.Launcher.LaunchUriAsynメソッドを使用して申請しているのですが、問題なく全て認定されています。もしリジェクトされた場合は、「ブラウザで表示させるのはあくまでも補助的な意味で、アプリの価値はアプリ内で提供しています。」と一文を追加しようかと思っていたのですが、この必要性もありませんでした。このアプリで使用しているWindows.System.Launcher.LaunchUriAsynメソッドの使い方では、大丈夫ではないかと思いますが、審査員の判断によるところが大きいので、100%とはいえませんが。
ピンがタップされた時は、myStackPanelオブジェクトを表示します。札所の番号とお寺の名前、所在地が表示されます。
myStackPanelがタップされた時はmyStackPanelオブジェクトを非表示にします。
Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
myMap.ZoomLevel = 8
xmldoc = XElement.Load("michitomo.xml")
Dim myLatitude As String = String.Empty
Dim myLongitude As String = String.Empty
Dim number As String = String.Empty
For Each result In From c In xmldoc.Descendants("札所") Select c
zIndexNo = zIndexNo + 1
myLatitude = result.Attribute("緯度").Value
myLongitude = result.Attribute("経度").Value
number = result.Attribute("番号").Value
Dim myPin As New Pushpin
myPin.Background = New SolidColorBrush(Colors.Crimson)
myPin.Text = number
myMap.Center = New Location(CDbl(myLatitude), CDbl(myLongitude))
Dim myStackPanel As New StackPanel
myStackPanel.SetValue(Canvas.ZIndexProperty, zIndexNo)
myStackPanel.Background = New SolidColorBrush(Colors.Pink)
myStackPanel.Visibility = Xaml.Visibility.Collapsed
Dim myTextBlock As New TextBlock
myTextBlock.Padding = New Thickness(5)
myTextBlock.Text = number & "番札所=" &result.Value&vbCrLf& "所在地=" &result.Attribute("所在地").Value
myTextBlock.Foreground = New SolidColorBrush(Colors.Navy)
myTextBlock.FontSize = 20
Dim myButton As New Button
With myButton
.Background = New SolidColorBrush(Colors.Navy)
.Content = "検索"
.Tag = Index.ToString
End With
myStackPanel.Children.Add(myTextBlock)
myStackPanel.Children.Add(myButton)
MapLayer.SetPosition(myStackPanel, New Location(CDbl(myLatitude), CDbl(myLongitude)))
myMap.Children.Add(myStackPanel)
MapLayer.SetPosition(myPin, New Location(CDbl(myLatitude), CDbl(myLongitude)))
myMap.Children.Add(myPin)
Index += 1
AddHandlermyButton.Click, Async Sub(mySender As Object, myArgs As RoutedEventArgs)
Dim myIndex = DirectCast(mySender, Button).Tag
Dim _Index As Integer = CInt(myIndex)
Dim myTemple = xmldoc.Descendants("札所")(_Index).Value
Dim myUri = New Uri("http://www.bing.com/search?q=" &Uri.EscapeDataString(myTemple))
Dim mySucess = Await Windows.System.Launcher.LaunchUriAsync(myUri)
If Not mySucess Then
Exit Sub
End If
End Sub
AddHandlermyPin.Tapped, Sub()
myStackPanel.Visibility = Xaml.Visibility.Visible
End Sub
AddHandlermyStackPanel.Tapped, Sub()
myStackPanel.Visibility = Xaml.Visibility.Collapsed
End Sub
Next
End Sub
End Class
地図の拡大縮小、表示モードの変更等はBing Mapsで自動的に処理されるため、コードを書く必要はありません。
今回はここまでです。ありがとうございました。
- この記事のキーワード