第9回 効果的に情報を提示する連載:Windowsストア・アプリ開発入門(4/7 ページ)

» 2014年01月10日 13時35分 公開
[山本康彦(http://www.bluewatersoft.jp/),BluewaterSoft]

保持データをライブタイル登録クラスに渡すメソッド

 さて、上で作ったLiveTileクラスのUpdateLiveTileメソッドを呼び出せば、ライブタイルが登録される。呼び出す側では、保持しているFeedsDataオブジェクトからLiveTileDataオブジェクトのコレクションを作って、それを渡せばよい(次のコード)。

private void OnLoadDataCompleted(object sender, EventArgs e)
{
  var feedsData = App.Current.Resources["feedsDataSource"] as DataModel.FeedsData;

  // 保持しているデータから、ライブタイルのために必要なデータを取り出す。
  // =「お気に入り」以外のフィードの、フィードタイトルと記事タイトル
  var liveTileDataList
    = feedsData.Feeds
        .Where(f => f.Title != "お気に入り") // 「お気に入り」は除外する
        .Select(f =>
          {
            var tileData = new Tile.LiveTileData()
                               {
                                 FeedTitle = f.Title // フィードのタイトルをセット
                               };
            foreach(var item in f.Items)
              tileData.ArticleTitles.Add(item.Title); // 記事のタイトルをセット
            return tileData;
          });

  // ライブタイルを登録する
  Tile.LiveTile.UpdateLiveTile(liveTileDataList);
}

上で作ったLiveTileクラスのUpdateLiveTileメソッドを呼び出す(C#)
このメソッドは「App.xaml.cs」ファイルに記述する。
メソッド名が「OnLoadDataCompleted」とイベントハンドラーのものになっていることについては、この後すぐ説明する。

ライブタイルを登録するためのイベントを追加する

 上のメソッドは、いつ実行すればよいだろうか? RSSフィードをダウンロードした直後に実行したい。そこで今回は、ダウンロードが完了したところでイベントを発生させ、それを受けて上のメソッドを呼び出すようにしてみよう。

 まず、DataLoaderクラス(プロジェクトのLogicフォルダーの「DataLoader.cs」ファイル)に、公開するイベントとそれをトリガーするコードを次のように追加する。

public class DataLoader
{
  // データのロードが完了したときに起動されるイベント
  public static event EventHandler LoadCompleted;

  // イベントをトリガーするメソッド
  private static void OnLoadCompleted()
  {
    var handler = LoadCompleted;
    if (handler != null)
      handler.Invoke(null, EventArgs.Empty);
  }

  ……省略……

  //【第7回】リロードする
  internal static async void ReloadStart(DataModel.FeedsData feedsData)
  {
    ……省略……
    await LoadAsync(feedsData);

    // データのロードが完了したときにイベントを起動する
    OnLoadCompleted();
  }

  //【第6回】データを取得する
  internal static async void LoadStart(DataModel.FeedsData feedsData)
  {
    await LoadAsync(feedsData);

    //【第8回】ローミング・フォルダーのファイルから読み込んだ「お気に入り」を追加する
    var favoriteFeed = await Logic.FavoriteStorage.GetFavoriteFeedAsync();
    feedsData.Feeds.Add(favoriteFeed);

    // データのロードが完了したときにイベントを起動する
    OnLoadCompleted();
  }

  ……省略……

DataLoaderクラスにダウンロード完了時のイベントを追加する(C#)
太字の部分を追加する。

 このLoadCompletedイベントを受けてライブタイルの登録が行われるように、イベントハンドラーを「App.xaml.cs」ファイルで追加する(次のコード)。

protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
  ……省略……

  if (rootFrame == null)
  {
    //【第9回】データのロードが完了したときのイベントハンドラーを登録する
    Logic.DataLoader.LoadCompleted += this.OnLoadDataCompleted;

  ……省略……

Appクラスにイベントハンドラーの登録を追加する(C#)
太字の部分を追加する。
アプリの起動時に、LoadCompletedイベントハンドラーをセットする。
これで、RSSフィードのダウンロードが完了したときに、前述のOnLoadDataCompletedメソッドが呼び出される。

 以上で、ライブタイルの実装は完成である。アプリの起動時にAppクラスのOnLaunchedメソッド内でイベントハンドラーを登録し、RSSフィードのダウンロードが完了するたびに発生するイベントを受けて、ライブタイルの登録処理が実行される。

ライブタイルをテストする

 ライブタイルはVS 2013付属のシミュレーターでは動作しないため、実機で確認しなければならない。また、正しいコードのはずなのにライブタイルが表示されないことがある。そのときはWindowsを再起動してみてほしい。

 どうにもうまくいかないときは、スケジュールされた通知の実装を試してみる手もある。スケジュールされた通知では、キューに入っている通知を取得できるのだ。

 ライブタイルがうまく動かないときは、次のドキュメントも参照してほしい。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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