ロジックコードを記述する
ソリューションエクスプローラー内のMainPage.xamlを展開し、MainPage.xaml.vbをダブルクリックして、リスト3のコードを記述します。
ロジックコードを記述する
リスト3 (MainPage.xaml.vb)
Option Strict On
Imports Microsoft.Phone.Controls
タイマーを表すクラスの含まれる、System.Windows.Threading名前空間をインポートします。
Imports System.Windows.Threading
Windows Phone上のバック グラウンドで、ファイル転送を有効にするAPI へのアクセスを提供する、Microsoft.Phone.BackgroundTransfer名前空間をインポートします。
Imports Microsoft.Phone.BackgroundTransfer
Partial Public Class MainPage
Inherits PhoneApplicationPage
' Constructor
Public Sub New()
InitializeComponent()
End Sub
BackgroundTransferRequestクラス型の反復処理する列挙子である、myTransferRequestメンバ変数を宣言します。BackgroundTransferRequestクラスは、バックグラウンドでファイル転送をリクエストするクラスです。
Dim myTransferRequests As IEnumerable(Of BackgroundTransferRequest)
タイマーを表すDispatcherTimerクラスの新しいインスタンス、myTimerメンバ変数を宣言します。
Dim myTimer As New DispatcherTimer
ページが読み込まれた時の処理
Intervalプロパティにタイマーの間隔を300ミリセコンドと指定します。
AddHandlerメソッドで、指定したタイマーの間隔が経過し、タイマーが有効である場合に発生するTickイベントに、イベントハンドラを指定します。イベントハンドラ内では以下の処理を実行します。
転送するファイルがない場合はタイマーをストップします。それ以外の場合は、転送されるファイルのコレクション内を変数myTransferで反復処理しながら、TransferStatusプロパティで、ファイル転送の状態を取得し、要求されたファイルが現在転送されている(TransferStatus.Transferring)か、または、バック グラウンド転送サービス キューで待機中(TransferStatus.Waiting)の時は、ListBox内にファイルの転送状況を示す、ResetTransferListBoxプロシージャを実行します
Private Sub MainPage_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
myTimer.Interval = TimeSpan.FromMilliseconds(300)
AddHandler myTimer.Tick, Sub()
If myTransferRequests Is Nothing = True Then
myTimer.Stop()
Return
Else
For Each myTransfer In myTransferRequests
If myTransfer.TransferStatus = TransferStatus.Transferring Or myTransfer.TransferStatus = TransferStatus.Waiting Then
ResetTransferListBox()
Return
End If
Next
End If
myTimer.Stop()
End Sub
End Sub
ファイルの転送状況を表示する処理
BackgroundTransferService.Requestsプロパティは、呼び出されるアプリケーションに関連付けられた、全てのアクティブな転送要求の列挙体を取得し、変数myTransferRequestsに格納します。
転送要求された列挙体のカウントが0より大きい場合は、「登録なし」と書いているTextBlockを非表示にします。それ以外の場合は「登録なし」を表示します。転送要求ファイルが存在しない場合は「登録なし」を表示します。ListBox(TransferListBox)コントロールのItemsSourceプロパティにmyTransferRequestsオブジェクトを指定します。これにより、転送要求されたファイルがある場合は、ListBox内に表示されます。
Private Sub ResetTransferListBox()
myTransferRequests = BackgroundTransferService.Requests
If myTransferRequests.Count() > 0 Then
TextBlock1.Visibility = Visibility.Collapsed
Else
TextBlock1.Visibility = Visibility.Visible
End If
TransferListBox.ItemsSource = myTransferRequests
End Sub
指定したバックグラウンドの転送要求を削除する処理。引数に文字列型のmyTransferIDを指定します。
BackgroundTransferService.Findメソッドで、転送要求を指定されたID(myTransferID)を持つ、バックグラウンドの転送要求を取得します。
BackgroundTransferService.Removeメソッドで、BackgroundTransferService.Findメソッドで取得したID(myTransferRemove)を持つ、バックグラウンドの転送要求を削除します。
Private Sub RemoveTransferRequest(myTransferID As String)
Dim myTransferRemove As BackgroundTransferRequest = BackgroundTransferService.Find(myTransferID)
Try
BackgroundTransferService.Remove(myTransferRemove)
Catch ex As Exception
MessageBox.Show(ex.Message)
Exit Sub
End Try
End Sub
ListBox内の[削除]ボタンがクリックされた時の処理
ButtonのTagプロパティに持たせておいた、RequestId(リクエストに関連付けられた一意の識別子)を取得して、変数myTransferIDに格納します。取得したmyTransferIDを引数にRemoveTransferRequestプロシージャを実行します。任意の転送要求が削除されたListBoxを再表示する、ResetTransferListBoxプロシージャを実行します。
Private Sub RemoveButton_Click(sender As Object, e As EventArgs)
Dim myTransferID As String = DirectCast(sender, Button).Tag.ToString
RemoveTransferRequest(myTransferID)
ResetTransferListBox()
End Sub
画面の遷移で移動した時に最初に呼ばれるイベント
Module内で宣言している(後述)している、FileName変数に.wmvという文字列が含まれていた場合は、ListBoxに適用するテンプレートをListBoxTemplate2とします。それ以外の場合はListBoxTemplateを適用します。ResetTransferListBoxプロシージャを実行し、タイマーを開始します。
Protected Overrides Sub OnNavigatedTo(e As System.Windows.Navigation.NavigationEventArgs)
If FileName.ToString.Contains(".wmv") Then
TransferListBox.SetValue(ListBox.ItemTemplateProperty, Resources("ListBoxTemplate2"))
Else
TransferListBox.SetValue(ListBox.ItemTemplateProperty, Resources("ListBoxTemplate"))
End If
ResetTransferListBox()
myTimer.Start()
MyBase.OnNavigatedTo(e)
End Sub
ApplicationBar内に表示される+の追加アイコンがクリックされた時の処理
変数FileNameに.wmvという文字列が含まれており、かつ、転送要求された列挙体のカウントが0より大きい場合は、警告メッセージを表示します。WMVファイルとImageファイルを同じListBox内に表示させることはできません。また、FileName変数に.wmvという文字列が含まれているだけの時は、FileName変数をクリアします。またFileName変数に.wmvという文字列と、.pngという文字列が含まれているだけの時も、FileName変数をクリアしておきます。
NavigationService.Navigateメソッドで、後編で作成するAddBackGroundTransfer.xamlページに遷移します。
Private Sub AddData_Click(sender As Object, e As EventArgs)
If FileName.ToString.Contains(".wmv") AndAlso TransferListBox.Items.Count > 0 Then
MessageBox.Show("WMVが選択されたか、WMVが実行されました。WMVを削除してください")
Exit Sub
ElseIf FileName.ToString.Contains(".wmv") AndAlso TransferListBox.Items.Count = 0 Then
FileName.Clear()
ElseIf FileName.ToString.Contains(".wmv") AndAlso FileName.ToString.Contains(".png") AndAlso TransferListBox.Items.Count = 0 Then
FileName.Clear()
End If
NavigationService.Navigate(New Uri("/AddBackGroundTransfer.xaml", UriKind.Relative))
End Sub
ApplicationBar内に表示される×の削除アイコンがクリックされた時の処理
バックグラウンド転送されるファイルのコレクション内を、変数myTransferで反復処理しながら、TransferStatusプロパティでファイル転送の状態を取得し、TransferStatus.Completedで転送が完了している場合は、RequestIdを引数にしてRemoveTransferRequestプロシージャを実行して、全てのリクエストを削除します。TransferStatus.Completedは、転送が成功裏に完了したかどうかに関係なく、バックグラウンド転送サービスによって、このリクエストがもはや有効ではないことを意味します。変数FileNameをクリアし、ResetTransferListBoxプロシージャを実行します。
Private Sub RemoveAllData_Click(sender As Object, e As EventArgs)
For Each myTransfer In BackgroundTransferService.Requests
If myTransfer.TransferStatus = TransferStatus.Completed Then
RemoveTransferRequest(myTransfer.RequestId)
End If
Next
FileName.Clear()
ResetTransferListBox()
End Sub
[WebBrowser]ボタンがクリックされた時の処理
NavigationService.Navigateメソッドで、後編で作成するWebBrowser.xamlに遷移します。
Private Sub browserButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles browserButton.Click
NavigationService.Navigate(New Uri("/WebBrowser.xaml", UriKind.Relative))
End Sub
End Class
<後編へ続く>
