8.1で追加された新しいコントラクトを利用すると、カレンダーアプリに予定を入れられる。カレンダーへの予定追加と更新の方法を説明する。イベントの予約をするアプリで、予約の完了と同時にそのイベントの予定をカレンダーに入れたいといった場合だ。8.1)で追加された新しいコントラクトを利用すると、それが可能になる。本稿では、新しいコントラクトを紹介した後、新しい予定を作ってカレンダーに入れ、またそれを更新する方法を解説する。8.1版)」からダウンロードできる。2013)が必要である。Windows(日本語版)*1を使用している。Windows」から無償で入手できる。新しい2つのコントラクト共有やファイルピッカーなどのコントラクトは、すでにおなじみだろう。8.1では、予定(Appointment)と連絡先(Contact)のコントラクトが新しく追加された(次の画像)。カレンダーアプリに予定を入れるには、予定コントラクトを用いる。Events」(2013/6/27)の資料より抜粋。card)からは、メールを送信したりSkypeで電話をかけたりできる。8から存在している連絡先ピッカー(Windows.ApplicationModel.Contacts.Provider名前空間)と、この新設された連絡先プロバイダーは別のものである。予定を管理するアプリ(=カレンダーアプリ)は「予定プロバイダー」と呼ばれ、連絡先を管理するアプリは「連絡先プロバイダー」と呼ばれる。2013のGUIからは設定できない)。カレンダーアプリに予定を入れる側のアプリには、宣言は不要だ。本稿では予定のコントラクトを利用する。8.1に標準の「カレンダー」アプリが実装している。予定のコントラクトと予定プロバイダーを使うと、予定の追加、置き換え、そして予定の表示(正確には、予定が入っている付近の日時の表示)が可能だ。次の画像の左半分は本稿のために作成したアプリで、予定をカレンダーアプリに追加しようとしているところ。右半分はカレンダーアプリで、追加された予定の辺りのカレンダーを表示しているところである。左側のアプリから、右側のカレンダーアプリに予定を追加し、その予定の付近を表示させている。左側のアプリでは、さらに同じ予定を追加しようとしていて、フライアウトが出ている(このまま[追加]ボタンをタップすると、右側に予定がもう1つ重複して登録されてしまう)。共有コントラクトや印刷コントラクトなどでは画面の右端から大きなフライアウトが出てくるが、新しく追加された予定と連絡先ではこのように画面内に小さなフライアウトが出る。UIを作成する本稿ではXAMLコードの解説はしないので、次の図を参考にして適宜UIを作成してほしい。TextBoxコントロール(Windows.UI.Xaml.Controls名前空間)に指定してあるMaxLengthプロパティの値は、予定プロバイダーが受け取り可能な最大長である。本稿のために作成したアプリのUIカレンダーアプリに予定を追加するには?予定を表すAppointmentオブジェクト(Windows.ApplicationModel.Appointments名前空間)を作り、AppointmentManagerクラス(Windows.ApplicationModel.Appointments名前空間)のShowAddAppointmentAsyncメソッドを呼び出せばよい。ShowAddAppointmentAsyncメソッドを呼び出すときに、フライアウトを表示する基準位置を指定する必要がある。予定を表すAppointmentオブジェクトは、次に示すメソッドのようにして作成する。FunctionAppointmentオブジェクトを作成するメソッド(上:C#、下:VB)MainPage.xaml.csファイルにこのコードを追加する。この他にも多くの情報を追加できる。次に、フライアウトを表示する基準位置は、タップされたボタンにしよう。ボタンなどのFrameworkElementオブジェクト(Windows.UI.Xaml名前空間)の位置とサイズを取得するコードは次のメソッドのように書ける。Functionコントロールの位置とサイズを取得するメソッド(上:C#、下:VB)最後に、ShowAddAppointmentAsyncメソッドの呼び出しを合わせて、ボタンのクリックイベントにまとめる(次のコード)。Sub予定を作ってカレンダーアプリに登録するフライアウトを出すコード(上:C#、下:VB)非同期メソッドの呼び出しをしているので、メソッドのシグネチャにasync/Asyncキーワードが必要だ。このコードではappointmentId変数を使っていないが、ShowAddAppointmentAsyncメソッドの呼び出し後にappointmentId変数が空文字列だったら予定の追加に失敗したと判定できる。ここで注意すべきは、ShowAddAppointmentAsyncメソッドを呼び出しても、予定はカレンダーに登録されず、予定をカレンダーアプリに登録するためのフライアウトが表示されるだけであることだ。フライアウトの下部にある[追加]ボタンをエンドユーザーがタップしたときに、実際にカレンダーアプリに予定が追加されるのである。カレンダーアプリが予定の追加に成功すると、1文字以上の文字列(「予定ID」)がShowAddAppointmentAsyncメソッドから返ってくる。エンドユーザーが[追加]ボタンをタップせずにフライアウトを閉じたり、タップしてもカレンダーアプリ側で予定の追加に失敗したりすると、空文字列(=String.Empty)が返される。カレンダーアプリに予定を表示させるには?AppointmentManagerクラスのShowTimeFrameAsyncメソッドを呼び出せばよい(次のコード)。それだけで、カレンダーアプリが起動して、指定日時前後のカレンダーが表示される。横置き画面の場合は、先に載せた画像のように自動的に画面が分割され、呼び出し元のアプリとカレンダーアプリが並んで表示される。Sub予定の登録に成功したときにカレンダーアプリを表示するコード(上:C#、下:VB)太字の部分を追加する。予定の登録に成功したときに、カレンダーアプリが表示される。実際に表示される範囲は、duration引数に基づいてカレンダーアプリが決定する。カレンダーアプリの予定を更新するには?AppointmentManagerクラスのShowReplaceAppointmentAsyncメソッドを使う。予定を追加するときのShowAddAppointmentAsyncメソッドとの違いは、既存の予定を識別するための予定IDも引数として渡すことだ(次のコード)。実際のアプリでは、予定IDを保存し管理するロジックを作り込む必要がある。Sub既存の予定を置き換えるコード(上:C#、下:VB)ここで使っているappointmentIdは、予定を追加したときの返値を保存しておいたもの。予定の更新に成功したときのnewAppointmentIdは、元のappointmentIdとは異なっている可能性があるので注意。ShowReplaceAppointmentAsyncメソッドも、予定を更新するフライアウトを出すだけであり、実際に更新されるかどうかはShowAddAppointmentAsyncメソッドと同様である。本稿では紹介しなかったが、予定を削除するためのShowRemoveAppointmentAsyncメソッドもある。まとめAppointmentManagerクラスを使って、カレンダーアプリに予定を追加したり更新したりできる。カレンダーアプリに任意の日時を表示させることも可能だ。予定コントラクトについては、次のドキュメントも参照してほしい。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。