共有に送る機能はコピーと似ているが、システム側からの要求に応える形の実装になる点が大きく異なる。共有チャームが開かれると、システム側からアプリに対してDataPackageオブジェクトが渡されるので、そこに共有したいデータをセットすればよい。なお、前述したように、共有チャームはエンド・ユーザーが画面右端のチャーム・バーを操作して開くのが標準だが、本アプリではアプリ・バーのコマンド・ボタンからも開けるようにする。
共有チャームを開く
コードビハインドから共有チャームを開くには、自動生成させたShareButton_Clickメソッドに1行記述するだけだ(次のコード)。
private void ShareButton_Click(object sender, RoutedEventArgs e)
{
Windows.ApplicationModel.DataTransfer.DataTransferManager.ShowShareUI();
}
イベント・ハンドラの付け外し
共有チャームが開かれたときにシステムから呼び出されるイベント・ハンドラを用意し、それをイベントに結び付ける。
ここで問題になるのが、イベント・ハンドラを付け外しするタイミングだ。記事表示画面でイベントに応答したい(=共有にデータを送りたい)ので、画面が表示されるときにハンドラを結び付けるのだが、それだけでは画面表示のたびにハンドラが追加され続けることになってしまう。ほかの画面に遷移するときにはハンドラを解除しなければならない。
ハンドラの解除は、ページのOnNavigatedFromメソッドかnavigationHelper_SaveStateメソッドで行えばよいかというと、それではだめなのだ。それらのメソッドは、画面遷移のときだけでなく、アプリが中断されるときにも呼び出される。画面のデータを保存するタイミングとしてはよいのだが、そこでハンドラを解除してはいけない。なぜなら、アプリが中断された後で終了させられることなく再開されることもあるからだ。もしも中断時にハンドラを外してしまうと、再開後には共有に送る機能が働かなくなってしまう。正しくは、OnNavigatingFromメソッドでハンドラを外す。こちらは、画面遷移のときだけ呼び出されるのだ。
まず、OnNavigatedToメソッドでイベント・ハンドラを結び付けよう(次のコード)。navigationHelper_LoadStateメソッドに書いてもよいのだが、ハンドラの解除はOnNavigatingFromメソッドで行うので、その対称性を考えるとOnNavigatedToメソッドの方がよいだろう。
protected override void OnNavigatedTo(NavigationEventArgs e)
{
navigationHelper.OnNavigatedTo(e);
// DataTransferManagerオブジェクトにイベント・ハンドラを結び付ける
var dtm
= Windows.ApplicationModel.DataTransfer.DataTransferManager
.GetForCurrentView();
dtm.DataRequested += this.OnDataRequested;
}
上のコードでは、まだ存在していない「OnDataRequested」という名前のメソッドを記述した。ここで、コード・エディタ上で「OnDataRequested」の中をクリックし、マウス・カーソルを「OnDataRequested」の左の方(「On」のあたり)に持っていってみよう。次の画像のように、メソッドを自動生成するオプションが出てくるので、それをクリックしてOnDataRequestedメソッドを自動生成させる。
次に、OnNavigatingFromメソッドでイベント・ハンドラを解除しよう(次のコード)。
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
base.OnNavigatingFrom(e);
var dtm
= Windows.ApplicationModel.DataTransfer.DataTransferManager.GetForCurrentView();
dtm.DataRequested -= this.OnDataRequested;
}
イベントに応える
共有チャームが開いたときのイベントに応答するのは、簡単だ。引数の中にDataPackageオブジェクトが入っているので、そこに共有したいデータをセットするだけだ。データをセットする処理は、コピーのときと同じである。先ほど自動生成させたOnDataRequestedメソッドに、次のコードのように記述する。
private async void OnDataRequested(
Windows.ApplicationModel.DataTransfer.DataTransferManager sender,
Windows.ApplicationModel.DataTransfer.DataRequestedEventArgs args)
{
Windows.ApplicationModel.DataTransfer.DataPackage package = args.Request.Data;
package.SetUriAndTitle(this.webView1.Source, this.webView1.DocumentTitle);
}
以上で、ほかのアプリにデータを送る機能は全部完成した。次は、リロード機能を作っていこう。
Copyright© Digital Advantage Corp. All Rights Reserved.