Windows Phoneページ遷移には色々あるよね


Sensor Checkerのダウンロードがもう直ぐ400を超えそうな勢いで、非常に嬉しいな…ということで、機能追加アップデートを開始しました。グラフ化された計測値のデータを、別のアプリで活用できるように、

  • E-Mailで送る
  • SkyDriveにアップロードする

の二つを予定していて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()メソッドがまたコールされるわけです。まぁ当たり前だね。しかし、センサーページでやっていることをひっくるめた処理の流れを書くと、

  1. センサーページでStartボタンをタッチ→Stopボタンがタッチされるまでセンサーで計測した値をメモリに保持
  2. センサーページでSendボタンをタッチ→メモリに保持した内容をXML形式でIsolatedStorageにファイルとして保存
  3. 保存したファイル名を付加して、このページに遷移 ※ここまでがセンサー計測ページ側の処理
  4. このページのOnNavigatedTo()メソッドがコールされる
  5. センサーページから渡されたデータのファイル名を、NavigationContextから取り出す
  6. ファイルを開き、Contentに書き込む
  7. ファイルはもういらないので、IsolatedStorageから削除

となっていて、センサーページからこのページに遷移した時は全く問題ないけれど、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へのアップロード方法もこのブログで紹介の予定です。

 

Comments (0)

Skip to main content