アプリケーションタイルとセカンダリタイルの更新と追加

Windows Phone 縦向きページ(ChangeApplicationTilePage.xaml)の追加
VS2010メニューの「プロジェクト(P)/新しい項目の追加(W)」と選択して、「Windows Phone 縦向きページ」を追加します。「名前(N)」には、ChangeApplicationTilePage.xamlと指定します(図5)。
| 図5:Windows Phone 縦向きページ を追加する(クリックで拡大) |
コントロールの配置
表示されるエミュレーターのデザイン画面上に、ツールボックスから、ListBox、TextBlock、TextBox、Image、Buttonコントロールを図6のように配置します。各コントロールに付けているNameにも注意してください。「項目名」の箇所は全てTextBlockコントロールです。Textプロパティに項目名を指定します。また、PageTitleという名前のTerxtBlockは削除しています。ApplicationTitleという名前のTextBlockのTextプロパティに、「Application Tileの変更」と指定しています。
| 図6:各コントロールを配置した(クリックで拡大) |
ListBoxコントロールのプロパティの[ブラシ]パネルにある、Background(背景色)にGainsboro、Foreground(文字色)にNavyを指定しています。[テキスト]パネルにある文字サイズには24を指定しています。
Buttonコントロールは初期の状態では、[共通]パネルにあるIsEnabledのチェックを外し、使用不可としておきます。
書き出されるXAMLコードは省略します。ダウンロードされたコードファイルをご覧ください。
クラスの追加(ItemAddClass.vb)
タイルの情報を記録したリスト1のTileinfo.xmlを読み込み、その値をリストに追加するクラスを作成します。
VS2010メニューの「プロジェクト(P)/クラスの追加(C)」と選択して、「クラス」を追加します。「名前(N)」はItemAddClassと指定します。[追加(A)]ボタンをクリックします(図4)。
表示されるクラスのコード画面にリスト4のコードを記述します。
ロジックコードを記述する
リスト4 (ItemAddClass.vb)
Option Strict On
Imports System.Xml.Linq
ItemAddClass クラス内にリスト型のItemAdd関数を定義します。
XElement.LoadメソッドでXMLTileInfo.xml文書ファイル(TileInfo.xml)を読み込み、<Info>要素のコレクション内を、変数resultで反復処理しながら、リストであるTileNoListにAddメソッドで<TileNo>要素の値を追加していきます。リストであるTileNoListを戻り値とします。
Public Class ItemAddClass
Function ItemAdd() As List(Of String)
Dim xmldoc As XElement = XElement.Load("TileInfo.xml")
Dim TileNoList As New List(Of String)
For Each result In From c In xmldoc.Descendants("Info") Select c
TileNoList.Add(result.Element("TileNo").Value)
Next
Return TileNoList
End Function
End Class
次に、ソリューションエクスプローラー内のChangeApplicationTilePage.xamlを展開し、ChangeApplicationTilePage.xaml.vbをダブルクリックして、リスト5のコードを記述します。
ロジックコードを記述する
リスト5 (ChangeApplicationTilePage.xaml.vb)
Option Strict On
LINQ to XMLを利用するためのクラスの含まれるSystem.Xml.Linq名前空間をインポートします。
Imports System.Xml.Linq
画像を表示するクラスの含まれる、System.Windows.Media.Imaging名前空間をインポートします。
Imports System.Windows.Media.Imaging
Windows Phoneのための、シェルAPIにアクセスを提供するクラスの含まれる、Microsoft.Phone.Shell名前空間をインポートします。
Imports Microsoft.Phone.Shell
Partial Public Class ChangeApplicationTilePage
Inherits PhoneApplicationPage
Public Sub New()
InitializeComponent()
End Sub
新しいClass1のインスタンスtileClassオブジェクトをメンバ変数として宣言します。
Dim tileClass As New Class1
メンバ変数myTileToFindを、アプリケーションタイルとセカンダリタイルのアプリケーションを管理するためのクラスである、ShellTileとして宣言します。アプリケーションタイルが、スタートに固定されていない場合でも、アプリケーションタイルは常に最初のタイルを指します。
Dim myTileToFind As ShellTile = ShellTile.ActiveTiles.First
タイル用のデータが、スタートに固定されるクラスである、StandardTileDataクラス用のメンバ変数、myTileDataを宣言します。
Dim myTileData As StandardTileData
ページが読み込まれた時の処理
新しいItemAddClassクラスのインスタンスitemClassを生成し、ItemAdd関数を呼び出して、ListBox1のItemSourceに指定します。タイルの項目名の一覧が表示されます。
Private Sub ChangeApplicationTilePage_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
Dim itemClass As New ItemAddClass
ListBox1.ItemsSource = itemClass.ItemAdd
End Sub
ListBoxから項目名が選択された時の処理
Class1のインスタンスからTileXmlDataRead関数を呼び出し、ListBoxのSelectedIndexに該当する<Info>要素の子要素<Title>の値を変数myTitleに格納します。同様にmyBackgroundImageに<BackgroundImage>要素の値、myCountに<Count>要素の値、myBackTitleに<BackTitle>要素の値、myBackBackgroundImageに<BackBackgroundImage>要素の値、myBackContentに<BackContent>要素の値を、それぞれ格納しておきます。
TitleTextBoxという名前のTextBoxのTextプロパティにmyTitle変数の値を指定します。
BackgroundImageという名前のImageのSourceプロパティに、Image/というフォルダ名を連結して、myBackgroundImage変数の値を相対URIで指定します。
CountTextBoxという名前のTextBoxにはmyCount変数の値を指定します。
BackTitleTextBoxという名前のTextBoxには、myBackTitle変数の値を指定します。
BackBackgroundImageという名前のImageのSourceプロパティに、Image/というフォルダ名を連結して、myBackBackgroundImage変数の値を相対URIで指定します。
BackContentTextBoxという名前のTextBoxには、myBackContent変数の値を指定します。
[Application Tileに適用]というボタンの使用を可能にします。
StandardTileDataクラスの「Title」、「BackgroundImage」、「Count」、「BackTitle」、「BackBackgroundImage」、「BackContent」プロパティに、先に取得しておいた変数の値を指定します。
StandardTileDataクラスの各プロパティについては、下記URIを参照してください(英語)。
http://msdn.microsoft.com/en-us/library/microsoft.phone.shell.standardtiledata_members(v=vs.92).aspx
Private Sub ListBox1_SelectionChanged(sender As Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox1.SelectionChanged
Dim myTitle As String = tileClass.TileXmlDataRead.Descendants("Info")(ListBox1.SelectedIndex).Element("Title").Value
Dim myBackgroundImage As String = tileClass.TileXmlDataRead.Descendants("Info")(ListBox1.SelectedIndex).Element("BackgroundImage").Value
Dim myCount As String = tileClass.TileXmlDataRead.Descendants("Info")(ListBox1.SelectedIndex).Element("Count").Value
Dim myBackTitle As String = tileClass.TileXmlDataRead.Descendants("Info")(ListBox1.SelectedIndex).Element("BackTitle").Value
Dim myBackBackgroundImage As String = tileClass.TileXmlDataRead.Descendants("Info")(ListBox1.SelectedIndex).Element("BackBackgroundImage").Value
Dim myBackContent As String = tileClass.TileXmlDataRead.Descendants("Info")(ListBox1.SelectedIndex).Element("BackContent").Value
TitleTextBox.Text = myTitle
BackgroundImage.Source = New BitmapImage(New Uri("Image/" & myBackgroundImage, UriKind.Relative))
CountTextBox.Text = myCount
BackTitleTextBox.Text = myBackTitle
BackBackgroundImage.Source = New BitmapImage(New Uri("Image/" & myBackBackgroundImage, UriKind.Relative))
BackContentTextBox.Text = myBackContent
changeTileButton.IsEnabled = True
myTileData = New StandardTileData With {.Title = myTitle, .BackgroundImage = New Uri("Image/" & myBackgroundImage, UriKind.Relative),
.Count = Integer.Parse(myCount),
.BackTitle = myBackTitle,
.BackBackgroundImage = New Uri("Image/" & myBackBackgroundImage, UriKind.Relative),
.BackContent = myBackContent} End Sub
[Application Tileに適用]ボタンがクリックされた時の処理
ShellTileクラスのUpdateメソッドでアプリケーションタイルを更新します。
Private Sub changeTileButton_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles changeTileButton.Click
myTileToFind.Update(myTileData)
End Sub
End Class
「アプリケーションタイルとセカンダリタイルの更新と追加」サンプルプログラム




