LaunchersとChoosersを使ってみる

2011年8月1日(月)
PROJECT KySS

ソリューションエクスプローラー内のMainPage.xamlを展開し、表示されるMainPage.xaml.vbをダブルクリックしてリスト3のロジックコードを記述します。

ロジックコードを記述する

リスト3(MainPage.xaml.vb)

Option Strict On
ランチャーやチューザーに関するクラスの含まれる、Microsoft.Phone.Tasks名前空間をインポートします。
Imports Microsoft.Phone.Tasks

Imports System.Windows.Media.Imaging
Partial Public Class MainPage
  Inherits PhoneApplicationPage
~コード略~

[メールを送る]ボタンがクリックされた時の処理

  新しいEmailComposeTaskのインスタンス、sendMailTaskオブジェクトを生成します。Toプロパティに「メールの送り先アドレス」、Subjectに「メールのサブジェクト」、Bodyに「メールの本文」、Ccに「メールをCCで送る相手のメールアドレス」を指定し、Showメソッドを実行します。
エミュレーター上ではAccountの設定ができていませんので、エラーとなります。
  Private Sub mailSendButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles mailSendButton.Click
    Dim sendMailTask As New EmailComposeTask
    With sendMailTask
      .To = "test@test.com"
      .Subject = "メールを送るテスト"
      .Body = "Windows Phone 7からメールを送ります。"
      .Cc = "test2@test.com"
    End With
    sendMailTask.Show()
  End Sub

[MediaPlayer]ボタンをクリックした時の処理

新しいMediaPlayerLauncherのインスタンス、mediaTaskオブジェクトを生成します。
  LocationプロパティにMediaLocationType.Installを指定します。これは、コンテンツとしてxapに動画ファイルが含まれている場合、つまりメディアファイルがアプリケーションのインストールディスクにある場合の動画を再生する方法です。分離ストレージにある場合は、MediaLocationType.Dataと指定します。
Controlsプロパティにはメディアプレイヤーに表示するコントロールを指定します。MediaPlaybackControls.Allと指定して、すべてのコントロールを表示させます。
Mediaプロパティには、メディアプレイヤーアプリケーションの再生メディアを指定します。ここでは、dougo320.wmvファイルを相対URIで指定しています。Showメソッドで実行します。
  Private Sub mediaButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles mediaButton.Click
    Dim mediaTask As New MediaPlayerLauncher
    With mediaTask
      .Location = MediaLocationType.Install
      .Controls = MediaPlaybackControls.All
      .Media = New Uri("dougo320.wmv", UriKind.Relative)
    End With
    mediaTask.Show()
  End Sub

[電話をかける]ボタンがクリックされた時の処理

NavigationService.NavigateメソッドでSelectPhoneNumberPage.xamlに遷移します。
SelectPhoneNumberPage.xaml.vbについては後述。
  Private Sub callPhoneButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles callPhoneButton.Click
    NavigationService.Navigate(New Uri("/SelectPhoneNumberPage.xaml", UriKind.Relative))
  End Sub

[メールアドレスの追加]ボタンがクリックされた時の処理

新しいSaveEmailAddressTaskのインスタンス、saveMailTaskオブジェクトを生成し、Showメソッドで実行します。
  Private Sub saveAddressButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles saveAddressButton.Click
    Dim saveMailTask As New SaveEmailAddressTask
    saveMailTask.Show()
  End Sub

[電話番号の追加]ボタンをクリックした時の処理

新しいSavePhoneNumberTaskのインスタンス、saveTelTaskオブジェクトを生成します。PhoneNumberプロパティを空にしておくと、phone numberの入力欄が空になっています。Showメソッドで実行します。
  Private Sub saveTelButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles saveTelButton.Click
    Dim saveTelTask As New SavePhoneNumberTask
    saveTelTask.PhoneNumber = String.Empty
    saveTelTask.Show()
  End Sub

[Web検索]ボタンがクリックされた時の処理

新しいSearchTaskのインスタンス、searchTaskオブジェクトを生成します。SearchQueryプロパティには検索クエリーを指定します。この値を空にしておくと、検索の入力欄が空になって検索キー入力を受け付ける状態になっています。SearchQueryプロパティに直接”Silverlight”と指定しておくと、実行と同時にSilverlightに関する情報が表示されます。Showメソッドで実行します。
  Private Sub searchButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles searchButton.Click
    Dim searchTask As New SearchTask
    searchTask.SearchQuery = String.Empty
    searchTask.Show()
  End Sub

[WebBrowser起動]ボタンをクリックした時の処理

 新しいWebBrowserTaskのインスタンス、browserTaskオブジェクトを生成します。URLプロパティを空にしておくと、サイトアドレスの入力欄が空になっていますので、見たいサイトのアドレスを入力できます。Showメソッドで実行します。
  Private Sub webBrowserButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles webBrowserButton.Click
    Dim browserTask As New WebBrowserTask
    browserTask.URL = String.Empty
    browserTask.Show()
  End Sub

[E-Mailアドレス帳]ボタンをクリックした時の処理

新しいEmailAddressChooserTaskのインスタンス、addressTaskオブジェクトを生成します。Showメソッドで実行します。
  AddHandlerメソッドで、タスクが完了した時のCompletedイベントハンドラを追加します。Completedイベント内では、完了イベントがTaskResult.OKで、正常に完了した場合には、メールアドレスをメッセージボックスで表示させます。
  Private Sub addressButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles addressButton.Click
    Dim addressTask As New EmailAddressChooserTask
    AddHandler addressTask.Completed, Sub(addressSender As Object, addressArgs As EmailResult)
                                        If addressArgs.TaskResult = TaskResult.OK Then
                                            MessageBox.Show(addressArgs.Email)
                                        End If
                                      End Sub
    addressTask.Show()
  End Sub

[電話番号選択]ボタンがクリックされた時の処理

新しいPhoneNumberChooserTaskのインスタンス、telTaskオブジェクトを生成します。Showメソッドで実行します。
AddHandlerメソッドで、タスクが完了した時のCompletedイベントハンドラを追加します。Completedイベント内では、完了イベントがTaskResult.OKで、正常に完了した場合には、電話番号をメッセージボックスで表示させます。
  Private Sub telButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles telButton.Click
    Dim telTask As New PhoneNumberChooserTask
    AddHandler telTask.Completed, Sub(phoneSender As Object, phoneArgs As PhoneNumberResult)
                                     If phoneArgs.TaskResult = TaskResult.OK Then
                                         MessageBox.Show(phoneArgs.PhoneNumber)
                                     End If
                                  End Sub
    telTask.Show()
  End Sub

[画像選択]ボタンがクリックされた時の処理

新しいPhotoChooserTaskのインスタンス、photoTaskオブジェクトを生成します。Showメソッドで実行します。
AddHandlerメソッドで、タスクが完了した時のCompletedイベントハンドラを追加します。Completedイベント内では、完了イベントがTaskResult.OKで、正常に完了した場合は以下の処理を行います。
Chooser での選択の結果は引数で渡されますので、渡された画像を BitmapImage オブジェクトに格納します。新しいImage のインスタンスmyImageオブジェクトを生成し、SourceプロパティにBitmapImage オブジェクトに格納した値を指定します。ContentPanelという名前のGridコントロールにmyImageオブジェクトを追加します。これでメニュー画面に選択した画像が表示されます。
  表示された画像の上でマウスの左ボタンが押下された時の処理を行います。myImageSenderオブジェクトに格納されているImageコントロールの情報を取得し、SourceプロパティにNothingを指定します。これで、画像がクリックされるとメニュー画面から消えます。
  Private Sub photoButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles photoButton.Click
    Dim photoTask As New PhotoChooserTask
    AddHandler photoTask.Completed, Sub(photoSender As Object, photoArgs As PhotoResult)
                                      If photoArgs.TaskResult = TaskResult.OK Then
                                           Dim bmp As New BitmapImage
                                           bmp.SetSource(photoArgs.ChosenPhoto)
                                           Dim myImage As New Image
                                           myImage.Source = bmp
                                           ContentPanel.Children.Add(myImage)
                                           AddHandler myImage.MouseLeftButtonDown, Sub(myImageSender As Object, myImageArgs As MouseButtonEventArgs)
                                                                            Dim selectImage As Image = DirectCast(myImageSender, Image)
  selectImage.Source = Nothing
                                                                        End Sub
                                      End If
                                    End Sub
    photoTask.Show() 
  End Sub
End Class

ソリューションエクスプローラー内のSelectPhoneNumberPage.xamlを展開し、表示されるSelectPhoneNumberPage.xaml.vbをダブルクリックしてリスト4のロジックコードを記述します。

リスト4 (SelectPhoneNumberPage.xaml.vb)

ここの処理は図1のメニューから[電話をかける]ボタンがクリックされ、SelectPhoneNumberPage.xamlページに遷移した時の処理になります。

Option Strict On
Imports System.Xml.Linq
Imports Microsoft.Phone.Tasks
Partial Public Class SelectPhoneNumberPage
  Inherits PhoneApplicationPage
~コード略~
  Dim xmldoc As XElement

ページが読み込まれた時の処理

XElement.LoadメソッドでXML文書ファイル(PhoneGuidance.xml)を読み込みます。
文字列型の新しいリストであるphoneListオブジェクトを宣言します。
<電話番号>要素のコレクションに対して、各要素を変数 result に格納しながら以下の処理を繰り返します。
文字列型のリストであるphoneListオブジェクトにAddメソッドで、<電話番号>要素の属性”title”の値を追加していきます。
ListBoxのItemsSourceプロパティにphoneListオブジェクトを指定します。これで、電話案内のメニュー一覧が表示されます。
  Private Sub SelectPhoneNumberPage_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    xmldoc = XElement.Load("PhoneGuidance.xml")
    Dim phoneList As New List(Of String)
    For Each result In From c In xmldoc.Descendants("電話番号") Select c
      phoneList.Add(result.Attribute("title").Value)
    Next
    ListBox1.ItemsSource = phoneList
  End Sub

任意の電話案内のメニューが選択された時の処理

新しいPhoneCallTaskのインスタンス、phoneTaskオブジェクトを生成します。
変数phoneNumberに、選択されたListBoxの項目のインデックスに該当する、<電話番号>要素の値を格納します。
phoneTaskオブジェクトのDisplayプロパティに、選択された項目名と電話番号を連結して指定します。
PhoneNumberプロパティには変数phoneNumberに格納されている電話番号を指定します。
Showメソッドでタスクを実行します。
  Private Sub ListBox1_SelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox1.SelectionChanged
    Dim phoneTask As New PhoneCallTask
    Dim phoneNumber As String = xmldoc.Descendants("電話番号")(ListBox1.SelectedIndex).Value
    With phoneTask
      .DisplayName = ListBox1.SelectedItem.ToString & ":" & phoneNumber & "に電話します。"
      .PhoneNumber = phoneNumber
      .Show()
    End With
  End Sub
End Class
  • 「LaunchersとChoosersを使ってみる」サンプルプログラム

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています