連載
» 2013年11月29日 10時41分 公開

連載:Windowsストア・アプリ開発入門:第7回 ほかのアプリにデータを送る (3/4)

[山本康彦(http://www.bluewatersoft.jp/),BluewaterSoft]

共有に送る機能を実装する

 共有に送る機能はコピーと似ているが、システム側からの要求に応える形の実装になる点が大きく異なる。共有チャームが開かれると、システム側からアプリに対してDataPackageオブジェクトが渡されるので、そこに共有したいデータをセットすればよい。なお、前述したように、共有チャームはエンド・ユーザーが画面右端のチャーム・バーを操作して開くのが標準だが、本アプリではアプリ・バーのコマンド・ボタンからも開けるようにする。

共有チャームを開く

 コードビハインドから共有チャームを開くには、自動生成させたShareButton_Clickメソッドに1行記述するだけだ(次のコード)。

private void ShareButton_Click(object sender, RoutedEventArgs e)
{
  Windows.ApplicationModel.DataTransfer.DataTransferManager.ShowShareUI();
}

共有チャームを開くコード(C#)
太字の部分を入力する。

イベント・ハンドラの付け外し

 共有チャームが開かれたときにシステムから呼び出されるイベント・ハンドラを用意し、それをイベントに結び付ける。

 ここで問題になるのが、イベント・ハンドラを付け外しするタイミングだ。記事表示画面でイベントに応答したい(=共有にデータを送りたい)ので、画面が表示されるときにハンドラを結び付けるのだが、それだけでは画面表示のたびにハンドラが追加され続けることになってしまう。ほかの画面に遷移するときにはハンドラを解除しなければならない。

 ハンドラの解除は、ページの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;
}

共有チャームが開いたときに呼び出されるイベント・ハンドラを結び付ける(C#)
太字の部分を入力する。
DataTransferManagerは、共有機能を管理するシステムのオブジェクト。GetForCurrentViewメソッドで、この画面に割り当てられているDataTransferManagerオブジェクトを取得する。そのDataRequestedイベントに「OnDataRequested」という名前のメソッド(まだ存在していない)を結び付ける。
なお、このメソッドは、コード・エディタ上では折りたたまれて見えないことがあるので、その場合は「NavigationHelper registration」と表示されている行を探し、その行頭に付いている「+」記号をクリックして展開してほしい。

 上のコードでは、まだ存在していない「OnDataRequested」という名前のメソッドを記述した。ここで、コード・エディタ上で「OnDataRequested」の中をクリックし、マウス・カーソルを「OnDataRequested」の左の方(「On」のあたり)に持っていってみよう。次の画像のように、メソッドを自動生成するオプションが出てくるので、それをクリックしてOnDataRequestedメソッドを自動生成させる。

C#のコード・エディタでイベント・ハンドラのメソッドを自動生成させる C#のコード・エディタでイベント・ハンドラのメソッドを自動生成させる
VS 2013では、未定義のメソッド呼び出しを書いたときに、メソッドを自動生成するためのオプションがこのように表示される。
あるいは、メソッド名を右クリックして、[生成]−[メソッド スタブ]を選んでも同じだ。
なお、VS 2013が提案してくれるメソッド名のままで構わないのであれば、「+=」まで入力したところでタブ・キーを2回押せばよい。

 次に、OnNavigatingFromメソッドでイベント・ハンドラを解除しよう(次のコード)。

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
  base.OnNavigatingFrom(e);

  var dtm
    = Windows.ApplicationModel.DataTransfer.DataTransferManager.GetForCurrentView();
  dtm.DataRequested -= this.OnDataRequested;
}

共有チャームが開いたときに呼び出されるイベント・ハンドラを解除する(C#)
メソッド全体を追加する。
OnNavigatedFromメソッドではなく、OnNavigatingFromメソッドだ。このメソッドは、画面遷移するときに、OnNavigatedFromメソッドの前に呼び出される。

イベントに応える

 共有チャームが開いたときのイベントに応答するのは、簡単だ。引数の中に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);
}

共有にデータを渡すコード(C#)
太字の部分を入力する。
2行目で呼び出しているSetUriAndTitleメソッドは、「コピー機能を実装する」のところで作成した拡張メソッドだ。この拡張メソッドを使うために、「ViewPage.xaml.cs」ファイルの冒頭部分に「using AtmarkItReader.Logic;」という記述の追加も必要だ。

 以上で、ほかのアプリにデータを送る機能は全部完成した。次は、リロード機能を作っていこう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。