ロジックコードを記述する
次に、MainPage.xamlを展開して表示される、MainPage.xaml.vbをダブルクリックして開き、リスト2のコードを記述します。
ロジックコードを記述する
リスト2 (MainPage.xaml.vb)
Option Strict On
単一のAPI を使用して、コンピューターの場所に容易にアクセスできる機能を提供するクラスの含まれる、System.Device.Location名前空間をインポートします。
Imports System.Device.Location
Windows PhoneのためのBing Maps Silverlightクラスの含まれる、Microsoft.Phone.Controls.Maps名前空間をインポートしておきます。
Imports Microsoft.Phone.Controls.Maps
Partial Public Class MainPage
Inherits PhoneApplicationPage
' コンストラクター
Public Sub New()
InitializeComponent()
End Sub
GeoCoordinateWatcherクラスの新しいインスタンスであるmyGeoCoordiWatcherメンバ変数を宣言します。
GeoCoordinateWatcherクラスは、緯度および経度の座標に基づく場所データを提供するクラスです。
Dim myGeoCoordiWatcher As New GeoCoordinateWatcher
ページが読み込まれた時の処理
MapのZoomLevelプロパティに10を指定します。このプロパティに値を指定しなければ、該当する位置が拡大表示されませんので、注意してください。
AddHandlerメソッドでGPS の位置情報が変化すると発生する、PositionChangedイベントに、イベントハンドラを追加します。イベントハンドラ内では、Dispatcher が関連付けられているスレッドで、デリゲートを非同期的に実行するmyPositionChangedイベントを、BeginInvokeメソッドで呼び出します。
Startメソッドで、GPS入力を開始します。
Private Sub MainPage_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
Map1.ZoomLevel = 10
AddHandler myGeoCoordiWatcher.PositionChanged, Sub(geoSender As Object, geoArgs As GeoPositionChangedEventArgs(Of GeoCoordinate))
Deployment.Current.Dispatcher.BeginInvoke(Sub() myPositionChanged(geoArgs))
End Sub
myGeoCoordiWatcher.Start()
End Sub
非同期で呼び出されるmyPositionChangedイベントの処理
緯度と経度を、引数である GeoPositionChangedEventArgs の 、Posiotion.Location.Latitude と Position.Location.Longitude から取得し、変数myLatitudeとmyLongitudeに格納しておきます。
地図を任意の位置に移動させるには、ダブル型の変数myLatitudeとmyLongitudeの値を指定したGeoCoordinateを、MapのCenterプロパティに指定します。
PushPinクラスの新しいインスタンスmyPinオブジェクトを生成します。Locationプロパティに、GeoCoordinateメソッドを使って緯度と経度を指定します。Contentプロパティには、文字列に変換した経度と緯度を、「-」で連結して指定します。ピン上に緯度と経度が表示されます。緯度と経度とContentの指定されたmyPinオブジェクトをAddメソッドでMapに追加します。これで、GPSで取得された位置にピンが表示され、ピンの中に現在地情報が表示されます。
Private Sub myPositionChanged(myPosition As GeoPositionChangedEventArgs(Of GeoCoordinate))
Map1.Children.Clear()
Dim myLatitude As Double = myPosition.Position.Location.Latitude
Dim myLongitude As Double = myPosition.Position.Location.Longitude
Map1.Center = New GeoCoordinate(myLatitude, myLongitude)
Dim myPin As New Pushpin
myPin.Location = New GeoCoordinate(myLatitude, myLongitude)
myPin.Content = myLatitude.ToString & "-" & myLongitude
Map1.Children.Add(myPin)
End Sub
アプリケーション終了時の処理
StopメソッドでGPS入力を停止します。
Private Sub MainPage_Unloaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Unloaded
myGeoCoordiWatcher.Stop()
myGeoCoordiWatcher = Nothing
End Sub
[航空写真]ボタンをクリックした時の処理
Buttonコントロールのテキストにより、条件分岐を行います。
Buttonコントロールのテキストが「航空写真」の場合は、地図の表示を航空写真モード(AerialMode)に切り替えます。Buttonコントロールのテキストを、「道路表示」に切り替えます。
Buttonコントロールのテキストが「道路表示」の場合は、地図の表示を道路表示モード(RoadMode)に切り替えます。Buttonコントロールのテキストを、「航空写真」に切り替えます。
Private Sub Button1_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
Select Case Button1.Content.ToString
Case "航空写真"
Map1.Mode = New AerialMode
Button1.Content = "道路表示"
Case "道路表示"
Map1.Mode = New RoadMode
Button1.Content = "航空写真"
End Select
End Sub
End Class
以上のコードを書けたら、実機で動作確認をしてみましょう。USBケーブルで実機を接続すると、Zuneが自動的に起動します。VS2010からデプロイ先に「Windows Phone Device」を選択して、「デバッグ(D) /デバッグ開始(S)」を選択します。プログラムが実機(IS12T)にデプロイされ、実機で動作します。
プログラムを削除する時は、プログラムのタイトルをホールドして表示される「削除」メニューを選択します。
