2011/4/15 Windows Phone 7 Deep Dive センサーセッションフォロー

今日はセミナーにお越しいただきありがとうございます。皆さんのDeep Dive!!の準備は整いましたか?

最新の資料は、後日オンラインの予定ですが、配布資料と違う点を補足しておきますね。しかし、まさかPCがプロジェクターにつながらないとわ。残念。申し訳ない。

先ず、Accelerometerセンサーから取得した値を、TextBlockのTextプロパティに書き込むところですが、非同期ハンドラが動いているのはUI描画をつかさどっているスレッドとは違うので、テキストのままだと、エクセプションが発生してしまいます。正しくは、次のように実装してください。

先ずは、以下のメソッドとデレゲータを定義します。

private void UpdateTextBlock(TextBlock target, string text){    target.Text = text;}private delegate void UpdateTextBlockHandler(TextBlock target, string text);

そして、ハンドラーメソッドの中で、

    tbAccelerometerX.Dispatcher.BeginInvoke(        new UpdateTextBlockHandler(UpdateTextBlock),        new object [] { tbAccelerometerX, e.X.ToString() });

とすれば、UIElementのDispatcherの処理キューに入って、UI描画をつかさどっているスレッドに委譲され、テキストブロックの文字列が更新されます。
外から飛んできたイベントを処理する場合は大抵別スレッドなので、この技を覚えておくと便利です。

また、セッションの中でも触れましたが、AccelerometerセンサーをReactive Extensionでエミュレートする事は出来ません。イベント引数のコンストラクターが無く、X、Y、Z方向のプロパティがRead Onlyになっているからです。更にAccelerometerクラスはシールド宣言されているので、継承してサブクラスを作る事もできません。唯一の方法は、このクラスと全く同じメンバーを持つクラスを独自に定義する事です。まぁそんなに複雑なクラスでも無いので、これでよいでしょう。

ちなみにエミュレータでAccelerometerを使うと、イベントは通知されてきます。値は、X=0、Y=0、Z=-1です。机に表面を上に置いた状態ですね。これ、定期的に何度も飛んできます。

それから、LocationをEmulateする仕掛けは、
https://create.msdn.com/en-us/education/catalog/article/GPS-Emulator
からEmulatorをダウンロードして使ってみてください。位置の指定をPC上のBingMapで出来るので、結構便利かも、です。
まぁ、秋葉原の秋月電子あたりに行けば、GPSのUSBドングル、3000円ぐらいで売っているので、それを買って、 PCにUSB接続すれば、仮想COMポートでアクセスでき、System.IO.Ports.SerialPortクラスを使えば、NEMAのデータを簡単に(?)GPSからのリアル情報を取得できます。
このEmulator、ソースコードも公開されているので、リアルGPS情報をハンドリングできる様、改造するのも面白いかも、です。

それから、SilverlightアプリケーションでMapを使うには、https://www.bingmapsportal.com でアプリケーション登録が必要です。アプリ名と使用目的を入力すると使うためのキーが得られます。それを、XAML内でMapのCredentialsProviderプロパティに値としてセットします。アプリケーション登録時、全ての種類を試したわけではありませんが、Evaluationを選択すると、キーはもらえないようなので、ちょっと試したい時はDeveloperを選択すると良いでしょう。

PS
MIXでWindows Phone 7の次のバージョンMangoがアナウンスされましたね。センサー系は、モーション系がかなり強化されて、動画もキャプチャーされるようになったので、(更にモーションセンサーをエミュレータがエミュレートしてくれる?)、今後、エキサイティング!!

センサー系は、気が付けば、私のライフワークになってる観があるので、今後も何か新しいことがわかったらポストしますね。乞うご期待!!