バックグラウンドによるファイル転送(前編)
2011年9月9日(金)
ソリューションエクスプローラー内の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
<後編へ続く>
「バックグラウンドによるファイル転送(前編)」サンプルプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- バックグラウンドによるファイル転送(後編)
- カメラで写した写真を分離ストレージに保存し、写真の一覧を表示する
- 読み込んだ画像に装飾を施し、PictureHUBに保存する
- 撮影した写真を分離ストレージとPicturesHUBに保存する
- 「住所の位置をBing Mapsに表示する」と「位置に画像付きピンを表示する」のサンプル
- モーションセンサーとShareStatusTask、MediaPlayerLauncherを使う
- タッチパネルでドラッグ&ドロップを使う汎用的なサンプル
- 写真をハート型に切り抜いて撮影するサンプル
- メッセージボックスの処理を分岐させる+2つのサンプル
- ContextMenuコントロールを使う、加速度センサー、GPSでの位置情報取得