Windows Phone Tips集 8

ロジックコードを記述する

次に、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)にデプロイされ、実機で動作します。

プログラムを削除する時は、プログラムのタイトルをホールドして表示される「削除」メニューを選択します。

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored