Sensor Checkerのダウンロードがもう直ぐ400を超えそうな勢いで、非常に嬉しいな…ということで、機能追加アップデートを開始しました。グラフ化された計測値のデータを、別のアプリで活用できるように、
の二つを予定していてE-Mail送付の機能は既に完成済み。このポストでは、先ずはE-Mail送付の機能を追加した時に気がついた、ページ遷移ロジックを作る時の注意点をメモります。
E-Mailを送付する画面としては、こんな感じのものをよういしました。
測定したデータをContentに表示し、一番上のテキストボックスにE-Mailアドレスを入力します。Memo欄に、測った時の状況(例えば、「100メートルダッシュ!」とか「素振り100本!」とか「力いっぱいトゥ!」とか)を入力、Sendボタンをタッチすれば、E-Mailアドレス送付タスクが起動して、メールの本文にXML形式で記述された計測値が格納されて送付される寸法。E-Mail送信は、
var task = new Microsoft.Phone.Tasks.EmailComposeTask();task.To = address;task.Subject = "sensor";task.Body = "...";task.Show();
で、Windows Phoneが提供するE-Mail送信機構が起動して簡単に送付できる。ここまではよかった。だが、しかし…
このページの色々な表示は、OnNavigateTo()メソッドの中で作っています。で、E-Mail送信用ページが表示されて、送信が終わると、このページに戻ってくるわけですね。で、当然OnNavigatedTo()メソッドがまたコールされるわけです。まぁ当たり前だね。しかし、センサーページでやっていることをひっくるめた処理の流れを書くと、
となっていて、センサーページからこのページに遷移した時は全く問題ないけれど、E-Mail送信ページから戻ってきた時にOnNavigatedTo()メソッドを実行しようとすると、4番のステップから実行されるので、既に削除してしまったファイルを開く破目になる。当然エラー発生。センサー計測のページからの遷移の時と、E-Mail送信ページからの戻りの時は区別するコードが必要って訳です。
まぁ、「単なる設計不足醬!!」といわれればそれまでですが、人間、あるページから能動的に遷移を書いているときは注意が向いても、終わって自動的に戻ってくる時は案外抜けがちなので、設計時にご注意。
ついでに、メールアドレスを手入力するのはとっても面倒なので、Microsoft.Phone.Tasks名前空間のEmailAddressChooserTaskを使って、アドレス帳から選択可能にする機能を加え多野で紹介しておく。
var task = new Microsoft.Phone.Tasks.EmailAddressChooserTask();task.Completed += new EventHandler<Microsoft.Phone.Tasks.EmailResult>(task_EMailAddrSelectCompleted);task.Show();
とやればこちらも簡単にアドレス選択用のデフォルト機能を使え、登録したハンドラがコールされると、選択結果が返ってくるので、それをアドレス用テキストボックスに代入すればよろし。
更に、センサー計測値なんてものは、多分自分にしか送信しない(筈)なので、ころころ変えるもんじゃない。だから、Sendボタンをタッチした時のハンドラで、
var appSettings = System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings;appSettings["address"] = textBoxAddres.Text;
と書いておけば、アプリの設定として保存される。それで、OnNavigatedTo()内で、
var appSettings = System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings;if (!appSettings.Contains("address")){ appSettings.Add("address","");}textBoxAddress.Tex = appSettings["address"];
と書いておけば、一度選択して送信に使ったアドレスが毎度このページが開かれる度に、アドレス欄にE-Mailアドレスが表示される。
以上でこのポストはおしまい。一旦これでMarketplaceに更新しようかと思ったが、折角Live SDKの最新版でSkyDriveアクセスが対応されたことだし、それにメールで送られるより、ファイルとして扱いたいよね…って事で、SkyDriveアップロード機能版が完成したときにMarketplaceに更新の予定。ファイルのSkyDriveへのアップロード方法もこのブログで紹介の予定です。