TextBlockのStyleプロパティに指定されているPhoneTextTitle1Styleでは、文字サイズが大きすぎるので、PhoneTextTitle2Styleを指定して文字サイズを小さくします。これらのスタイルは下記URLの「Theme Resources for Windows Phone」で定義されています。 {StaticResource}を使用して、これらのテーマリソースを参照します。 →参照:Theme Resources for Windows Phone(msdn)
Windows Phoneのスケジューラ機能へのアクセスを提供し、アラーム、通知、およびバックグラウンドエージェントが含まれるMicrosoft.Phone.Scheduler名前空間をインポートします。
Imports Microsoft.Phone.Scheduler
Partial Public Class MainPage
Inherits PhoneApplicationPage
' コンストラクター
Public Sub New()
InitializeComponent()
End Sub
XML要素を表すメンバ変数xmldocを宣言しておきます。
Dim xmldoc As XElement
ページがアクティブになった時に呼び出されるメソッド
XElement.LoadメソッドでXML文書ファイル(Reminder.xml)を読み込みます。
次に、文字列型の新しいインスタンスであるリストオブジェクトtitleListを作成します。
Descendantsメソッドで、子孫要素であるすべての 要素のコレクションに対して、各要素を変数resultに格納しながら、要素の値を、titleListオブジェクトにAddメソッドで追加していきます。</p>
<p>ListBoxのItemsSourceプロパティにtitleListオブジェクトを指定します。これで、Reminder.xmlの<title>要素の内容テキストが、ListBox内に一覧で表示されます。</p>
<pre class="brush: plain" type="syntaxhighlighter"> Protected Overrides Sub OnNavigatedTo(e As System.Windows.Navigation.NavigationEventArgs) xmldoc = XElement.Load("reminder.xml") Dim titleList As New List(Of String) For Each result In From c In xmldoc.Descendants("info") Select c titleList.Add(result.Element("title").Value) Next ListBox1.ItemsSource = titleList MyBase.OnNavigatedTo(e) End Sub
</pre>
<h4>ListBoxから任意の項目が選択された時の処理</h4>
<p>Reminderを設定した旨のメッセージを表示します。</p>
<p>ListBoxから、選択された項目のインデックスをmyIndex変数に格納しておきます。</p>
<p>読み込んだXML文書のmyIndexに該当する、<info>要素の子要素<comment>の値を取得し、変数commentに格納します。この場合、Uri.EscapeDataStringを使って取得した<comment>要素の内容をエスケープしておく必要があります。</p>
<p>ScheduledActionService.Findメソッドで、指定した名前のScheduledAction(この場合reminderSample)が見つかった場合は、RemoverメソッドでScheduledActionを削除します。</p>
<p>reminderSampleというScheduledActionで初期化された、新しいReminderのインスタンス、myReminderオブジェクトを作成します。</p>
<p>myReminderオブジェクトのプロパティを設定していきます。</p>
<p>Titleプロパティに現在の「何年何月何日の予定」と指定します。Contentプロパティには、読み込んだXML文書ファイル(Reminder.xml)のmyIndexに該当する、<info>要素の子要素<contents>の、内容テキストを指定します。</p>
<p>BeginTimeには、アクションのスケジュールが開始する時刻を設定します。サンプルでは、1分を指定しているため、アプリが起動して1分後に通知が表示されます。</p>
<p>ExpirationTimeには、アクションのスケジュールが期限切れになる時刻を設定します。サンプルでは2分後を指定しています。</p>
<p>NavigationUriには、通知から起動された場合に、アプリケーションに渡されるナビゲーション URI を設定します。このサンプルでは、これから作成するMessagePage.xamlに遷移します。その際、引数naiyouにcomment変数の値を渡します。</p>
<p>RecurrenceTypeには、通知の繰り返しの種類を設定します。このサンプルでは、RecurrenceInterval.Noneと指定して、通知の繰り返しを「なし」としています。<br /> None以外に、「毎日繰り返す」Daily、「毎週繰り返す」Weekly、「毎月繰り返す」Monthly、「各月末に繰り返す」EndOfMonth、「毎年繰り返す」Yearlyなどがあります。</p>
<p>ScheduledActionService.Addメソッドで、スケジュールされたアクション(myReminder)をオペレーティング システムに登録します。</p>
<pre class="brush: plain" type="syntaxhighlighter"> Private Sub ListBox1_SelectionChanged(sender As Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox1.SelectionChanged MessageBox.Show("Reminderを設定しました。") Dim myIndex As Integer = ListBox1.SelectedIndex Dim comment As String = Uri.EscapeDataString(xmldoc.Descendants("info")(myIndex).Element("comment").Value) If ScheduledActionService.Find("reminderSample") Is Nothing = False Then ScheduledActionService.Remove("reminderSample") End If Dim myReminder As New Reminder("reminderSample") With myReminder .Title = DateTime.Now.ToString("yyyy年MM月dd日") & "の予定" .Content = xmldoc.Descendants("info")(myIndex).Element("contents").Value .BeginTime = DateTime.Now.AddMinutes(1) .ExpirationTime = DateTime.Now.AddMinutes(2) .NavigationUri = New Uri("/MessagePage.xaml?naiyou=" & comment, UriKind.Relative) .RecurrenceType = RecurrenceInterval.None End With ScheduledActionService.Add(myReminder) End Sub
End Class
</pre>
<h3>「Windows Phone 縦向きのページ」(MessagePage.xaml)の作成</h3>
<p>VS2010メニューから「プロジェクト(P)/新しい項目の追加(W)」と選択し、「Windows Phone 縦向きのページ」を選択します。「名前(N)」にはMessagePage.xamlと入力します。</p>
<h3>MessagePage.xamlの編集とコントロールの追加</h3>
<p>ツールボックスからTextBlockコントロールを1個配置します。プロパティの[ブラシ]パネルにあるForegroundにRedを指定し、文字色を赤にします。[テキスト]パネルにある文字サイズを40、文字の回り込みを指定するTextWrappingにWrapと指定します(図3)。</p>
<table cellspacing="10" style="width: 636px;"> <tbody> <tr> <td width="204"><a href="/sites/default/files/articles/359703.png" target="_blank"><img alt=" " src="/sites/default/files/articles/359703.png" style="width:200px;" /></a></td> <td><strong><span style="font-size: 12px;color: rgb(255, 140, 0);">図3:TextBlockコントロールを配置し、プロパティを設定した(クリックで拡大)</span></strong></td> </tr> </tbody>
</table>
<p>書き出されるXAMLコードは省略します。</p>
<p>次に、MessagePage.xamlを展開して表示される、MessagePage.xaml.vbをダブルクリックして、リスト3のコードを記述します。</p>
<h3>ロジックコードを記述する</h3>
<h4>リスト3 (MessagePage.xaml.vb)</h4>
<pre class="brush: plain" type="syntaxhighlighter">Option Strict On
Partial Public Class MessagePage Inherits PhoneApplicationPage Public Sub New() InitializeComponent() End Sub
</pre>
<h4>ページがアクティブになった時に呼び出されるメソッド</h4>
<p>MainPage.xamlから渡された文字データを受け取ります。文字データはNavigationContextのQueryStringにDictionary として提供されます。</p>
<p>ContainsKeyメソッドで、指定したキー(この場合naiyou)が Dictionary に格納されているかどうかを判断します。格納されている場合は、送信時のキーワード(この場合naiyou)を基に渡された文字列情報の値(myParam(“naiyou”))を取得し、TextBlockにその値を表示します。</p>
<pre class="brush: plain" type="syntaxhighlighter"> Protected Overrides Sub OnNavigatedTo(e As System.Windows.Navigation.NavigationEventArgs) Dim myParam As IDictionary(Of String, String) = NavigationContext.QueryString If myParam.ContainsKey("naiyou") = True Then TextBlock1.Text = myParam("naiyou") End If MyBase.OnNavigatedTo(e) End Sub
End Class
</pre>
<!--pagebreak-->
<p>リマインダーアプリの解説は以上です。次ページからはアラームアプリを解説していきます。</p>
<h2>アラームを使う</h2>
<p>次に、アラームのサンプルを解説します。指定した時間でのスケジュールやダイアログの起動、定期的なスケジュールを指定できる点はリマインダーと同じですが、アラームでは起動時に再生されるカスタムサウンドファイルを指定することができます。サンプル動作は下記の通りです。</p>
<p>このサンプルでは、リストボックスに表示されたスケジュールを選択し、アラームにセットします。</p>
<p>その後、何か別なアプリを操作していると、1分後にサウンド(wmaファイル)が鳴ってダイアログが起動し、スケジュールを通知してくれます(図4)。</p>
<table cellspacing="10" style="width: 636px;"> <tbody> <tr> <td width="204"><a href="/sites/default/files/articles/359704.png" target="_blank"><img alt=" " src="/sites/default/files/articles/359704.png" style="width:200px;" /></a></td> <td><strong><span style="font-size: 12px;color: rgb(255, 140, 0);">図4:アラームを設定すると、指定した時刻にサウンドが鳴ってスケジュールを通知してくれる(クリックで拡大)</span></strong></td> </tr> </tbody>
</table>
<p>サンプル一式は、会員限定特典としてダウンロードできます。記事末尾をご確認ください。</p>
<h4>実機(IS12T)で動かした動画はこちら</h4>
<p><iframe allowfullscreen="" frameborder="0" height="420" src="http://www.youtube.com/embed/YrXgWtO4iwI?rel=0" width="560"></iframe></p>
<p style="font-size:12px; color:#000000; background-color:#F5F5F5; border: 1px solid #999999; padding: 5px; margin: 10px 0; text-indent:0;">(*)アラームと同時に実際にはサウンドが流れています。この動画ではサウンドは記録されておりません。</p>
<h3>プロジェクトの作成</h3>
<p>VS 2010のメニューから[ファイル(F)/新規作成(N)/プロジェクト(P)]と選択します。</p>
<p>次に、「Windows Phone アプリケーション」を選択して、「名前(N)」に任意のプロジェクト名を指定します。ここでは「WP71_ Alarm」という名前を付けています。Windows Phoneのバージョンは7.1を選択します。</p>
<p>VS2010メニューの「プロジェクト(P)/参照の追加(R)」と選択してSystem.Xml.Linqを追加しておいてください。また、リスト4のXML文書ファイル(Alarm.xml)も作成しておいてください。</p>
<p>ソリューションエクスプローラ内にWMAというフォルダを作成して、3つのサウンドファイルを置いています。ダウンロードされたサンプルファイルには、これらのファイルは追加済みです。</p>
<h4>リスト4 XML文書ファイル(Alarm.xml)</h4>
<pre class="brush: plain" type="syntaxhighlighter"><?xml version="1.0" encoding="utf-8" ?>
<アラーム> <情報> <タイトル>起床</タイトル> <内容>起床時間だよぉーー</内容> <音>Ring01.wma</音> </情報> <情報> <タイトル>アルバイト</タイトル> <内容>アルバイトの時間だよぉーー</内容> <音>Ring02.wma</音> </情報> <情報> <タイトル>デート</タイトル> <内容>デートの時間だよぉーー</内容> <音>Ring03.wma</音> </情報>
</アラーム>
</pre>
<h3>MainPage.xamlの編集とコントロールの追加</h3>
<p>LayoutRootという名前を持つ<Grid>要素のBackground(背景色)プロパティにWhiteを指定して、背景を白にします。すると、ApplicationTitleやPageTitleという名前を持つTextBlockの文字が見えなくなりますので、Foreground(文字色)にBlackを指定します。</p>
<p>PageTitleのTextプロパティには「アラームの設定」と指定します。TextBlockのStyleプロパティに指定されているPhoneTextTitle1Styleでは、文字サイズが大きすぎるので、PhoneTextTitle2Styleを指定します。</p>
<p>ツールボックスからListBoxコントロールを1個配置します。ListBoxのForeground(文字色)にはNavyを指定します(図5)。</p>
<table cellspacing="10" style="width: 636px;"> <tbody> <tr> <td width="204"><a href="/sites/default/files/articles/359705.png" target="_blank"><img alt=" " src="/sites/default/files/articles/359705.png" style="width:200px;" /></a></td> <td><strong><span style="font-size: 12px;color: rgb(255, 140, 0);">図5:ListBoxコントロールを配置する(クリックで拡大)</span></strong></td> </tr> </tbody>
</table>
<p>書き出されるXAMLコードは省略します。</p>
<!--pagebreak-->
<p>次に、MainPage.xamlを展開して表示される、MainPage.xaml.vbをダブルクリックしてリスト5のコードを記述します。</p>
<h3>ロジックコードを記述する</h3>
<h4>リスト5 (MainPage.xaml.vb)</h4>
<pre class="brush: plain" type="syntaxhighlighter">Option Strict On
Imports System.Xml.Linq
</pre>
<p>Windows Phoneのスケジューラ機能へのアクセスを提供し、アラーム、通知、およびバックグラウンドエージェントが含まれるMicrosoft.Phone.Scheduler名前空間をインポートします。</p>
<pre class="brush: plain" type="syntaxhighlighter">Imports Microsoft.Phone.Scheduler
Partial Public Class MainPage Inherits PhoneApplicationPage ' コンストラクター Public Sub New() InitializeComponent() End Sub Dim xmldoc As XElement
</pre>
<h4>ページがアクティブになった時に呼び出されるメソッド</h4>
<p>XElement.LoadメソッドでXML文書ファイル(Alarm.xml)を読み込みます。</p>
<p>文字列型の新しいインスタンスであるリストオブジェクトtitleListを作成します。Descendantsメソッドで、子孫要素であるすべての <情報> 要素のコレクションに対して、各要素を変数resultに格納しながら、<タイトル>要素の値をtitleListオブジェクトにAddメソッドで追加していきます。</p>
<p>ListBoxのItemsSourceプロパティにtitleListオブジェクトを指定します。これでAlarm.xmlの<タイトル> 要素の内容テキストが、ListBox内に一覧で表示されます。</p>
<pre class="brush: plain" type="syntaxhighlighter"> Protected Overrides Sub OnNavigatedTo(e As System.Windows.Navigation.NavigationEventArgs) xmldoc = XElement.Load("Alarm.xml") Dim titleList As New List(Of String) For Each result In From c In xmldoc.Descendants("情報") Select c titleList.Add(result.Element("タイトル").Value) Next ListBox1.ItemsSource = titleList MyBase.OnNavigatedTo(e) End Sub
</pre>
<h4>ListBoxから任意の項目が選択された時の処理</h4>
<p>アラームを設定した旨のメッセージを表示します。</p>
<p>ListBoxより選択された項目のインデックスをmyIndex変数に格納しておきます。</p>
<p>ScheduledActionService.Findメソッドで、指定した名前のScheduledAction(この場合AlarmSample)が見つかった場合は、RemoverメソッドでScheduledActionを削除します。</p>
<p>AlarmSampleというScheduledActionで初期化された、新しいAlarmのインスタンス、myAlarmオブジェクトを作成します。</p>
<p>myAlarmオブジェクトのプロパティを設定していきます。</p>
<p>Contentプロパティには読み込んだXML文書ファイル(Alarm.xml)のmyIndexに該当する<情報>要素の子要素<内容>の内容テキストを指定します。</p>
<p>BeginTimeには、アクションのスケジュールが開始する時刻を設定します。このサンプルでは1分を指定しているため、アプリが起動して1分後に通知が表示されます。</p>
<p>SoundにはAlarmが起動した時に再生されるサウンドファイルを指定します。myIndexに該当する<情報>要素の子要素<音>に記述されているサウンドファイルをWMAフォルダと連結して指定します。</p>
<p>RecurrenceTypeには、通知の繰り返しの種類を設定します。このサンプルでは、RecurrenceInterval.Noneと指定して、通知の繰り返しを「なし」としています。None以外に、「毎日繰り返す」Daily、「毎週繰り返す」Weekly、「毎月繰り返す」Monthly、「各月末に繰り返す」EndOfMonth、「毎年繰り返す」Yearlyなどがあります。</p>
<p>ScheduledActionService.Addメソッドで、スケジュールされたアクション(myAlarm)をオペレーティング システムに登録します。</p>
<pre class="brush: plain" type="syntaxhighlighter"> Private Sub ListBox1_SelectionChanged(sender As Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox1.SelectionChanged MessageBox.Show("アラームを設定しました。") Dim myIndex As Integer = ListBox1.SelectedIndex If ScheduledActionService.Find("AlarmSample") Is Nothing = False Then ScheduledActionService.Remove("AlarmSample") End If Dim myAlarm As New Alarm("AlarmSample") With myAlarm .Content = xmldoc.Descendants("情報")(myIndex).Element("内容").Value .BeginTime = DateTime.Now.AddMinutes(1) .Sound = New Uri("WMA/" & xmldoc.Descendants("情報")(myIndex).Element("音").Value, UriKind.Relative) .RecurrenceType = RecurrenceInterval.None End With ScheduledActionService.Add(myAlarm) End Sub
End Class
</pre>
<p>今回のサンプルは以上で終了です。</p>
<h4>【参照リンク】</h4>
<p>PROJECT KySSでは現在、16個のWindows PhoneアプリをMarketplaceに公開しています。試用版もありますので、興味のある方はお試しください。<br /> →参照:<a href="http://2008r2.projectkyss.net/App_WP.htm" target="_blank">Windows Phone App Information(PROJECT KySS)</a></p>
<div class="next_page_link" id="next_page_link_auto"><a href="/story/2012/06/25/3597?page=1" class="btn --next-prev next_page_link_auto_bancho_common">リマインダーとアラームを使うサンプル</a></div></body></html>