kazuakix の日記

Windows Phone とか好きです

Windows Phone 8.1 でセカンダリ タイルを作る

振り替え休日の朝、TL を眺めているとこんな電波を受信しました。


シンプルに作る

まずはシンプルに SecondaryTile の呼び出しを試してみましょう。

呼び出しに必要なパラメーターは任意のタイル ID、表示名、セカンダリ タイルから起動されたときのパラメーター、画像の URI でした。サイズも指定するようになっていますが、Windows Phone では無視されるようです。

var imageUri = new Uri("ms-appx:///Assets/SmallLogo.png");
var secondaryTile = new SecondaryTile(
    "TileID01", "SecondaryTileTest", "simple", 
    imageUri, TileSize.Default);
await secondaryTile.RequestCreateAsync();

 
ちなみにセカンダリタイルからアプリが起動された場合は、OnNavigatedTo でこのパラメーターを拾うことができます。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    // パラメーターを確認
    System.Diagnostics.Debug.WriteLine(e.ToString()); 
}


早速実行。

f:id:kazuakix:20141007130156j:plain,w240

できましたよ?(ジト目

 

セカンダリ タイルのデザインを変更する

もう少しデザインを凝っているのかな...という事で昨日と同じ方法でテンプレートを使ってデザインを変更してみます。

メインのタイルとの違いは TileUpdateManager.CreateTileUpdaterForApplication ではなく、TileUpdateManager.CreateTileUpdaterForSecondaryTile を使うだけです。更新対象のタイルは作成時に指定したタイル ID で区別します。

var imageUri = new Uri("ms-appx:///Assets/SmallLogo.png");
var secondaryTile = new SecondaryTile(
    "Tile02", "SecondaryTileTest", "simple02", 
    imageUri, TileSize.Default);
await secondaryTile.RequestCreateAsync();

var tileXml = TileUpdateManager.GetTemplateContent(
    TileTemplateType.TileSquare150x150Text01);
tileXml.GetElementsByTagName("text")[0].InnerText =
     "SecondaryTileTest";

var updater = 
    TileUpdateManager.CreateTileUpdaterForSecondaryTile("Tile02");
updater.Update(new TileNotification(tileXml));

これも実行。

f:id:kazuakix:20141007131442j:plain,w240

一体、どんなエラー出たんですか?(ジト目
 

あ、でも SDK のサンプルの随所にこんなコメントが入っていたのは気になりました。

// When a new tile is created, the app is suspended and the new tile is displayed to the user on the start screen.
// Any code after the call to RequestCreateAsync is not guaranteed to run.
(新しいタイルが作られると、アプリは中断されて新しいタイルがスタート画面に表示されます。RequestCreateAsync の呼び出しよりも後のコードが実行される保証はありません。)

セカンダリタイルの作成から更新 (特にネットワークから何かを読んでくる系?) は完了しないかもしれないという事です。このあたりは注意が必要そうですね。