バックグラウンドによるファイル転送(前編)

2011年9月9日(金)
PROJECT KySS

ソリューションエクスプローラー内の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

<後編へ続く>

  • 「バックグラウンドによるファイル転送(前編)」サンプルプログラム

四国の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メルマガ会員のサービス内容を見る

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