次に[ソリューション・エクスプローラー]内のFacebookInfoPage.xamlを展開して表示される、FacebookInfoPage.xaml.vbのコードを記述する。
先のページから渡された画像を取得し、MainImageに表示する。
Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) myBmp = CType(e.Parameter, BitmapImage) MainImage.Source = myBmp End Sub
このプログラムの肝となる、Facebookに画像をアップする処理だ。
Private Async Sub UploadButton_Click(sender As Object, e As RoutedEventArgs) Handles uploadButton.Click uploadButton.IsEnabled = False If messageTextBox.Text = String.Empty Then Dim message As New MessageDialog("コメントを入力してください。") Await message.ShowAsync uploadButton.IsEnabled = False Exit Sub Else ProgressRing1.IsEnabled = True ProgressRing1.IsActive = True myFB = New FacebookClient(accessToken) AddHandler myFB.PostCompleted, Async Sub(mySender As Object, myArgs As FacebookApiEventArgs) If myArgs.Cancelled Then Dim cancellationError = myArgs.Error ElseIf myArgs.Error Is Nothing = False Then Dim myDialog2 As MessageDialog = New MessageDialog("アップロード失敗") Await myDialog2.ShowAsync() flag = False Else flag = True End If End Sub ' このプログラムの肝、Facebookにコメント付き画像をアップロードする処理。 Using myStream As IO.Stream = Await myFile.OpenStreamForReadAsync() Await myFB.PostTaskAsync("/me/photos", New With {.message = messageTextBox.Text, .file = New FacebookMediaStream() With {.ContentType = "image/jpeg", .FileName = FileName}.SetValue(myStream)}) End Using End If If flag = True Then ProgressRing1.IsEnabled = False ProgressRing1.IsActive = False Dim message As New MessageDialog("アップロード成功") Await message.ShowAsync uploadButton.IsEnabled = True Else Dim message As New MessageDialog("アップロード失敗") Await message.ShowAsync uploadButton.IsEnabled = True Exit Sub End If End Sub End Class
まず、非同期処理で行われるため、メソッドの先頭にAsyncを追加し、「facebookにアップロード」アイコンの使用を不可とする。
コメント欄に何も入力されていなかったらメッセージを表示し、処理を抜ける。
コメントが入力されていた場合は、以下の処理を行う。プログレスリングを動作させる。モジュール変数accessTokenで初期化された、新しいFacebookClientのインスタンス、myFBオブジェクトを作成する。AddHandlerステートメントでは、Facebookに投稿が完了した場合の、イベントハンドラを追加する。イベントハンドラ内では以下の処理を行う。
投稿が失敗した場合は、「アップロード失敗」のメッセージを表示し、メンバー変数flagをFalseで初期化する。それ以外はTrueで初期化する。
OpenStreamForReadAsyncメソッドでは、指定したファイルから読み取るストリームを取得し、変数myStreamで参照する。
PostTaskAsyncメソッドで、パスに "/me/photos"、パラメータに、入力したコメント、ContentTypeに"image/jpeg"、FileNameにモジュール変数のFileNameを指定して、Facebookサーバに非同期処理のPOSTリクエストを送信する。
ブール型メンバー変数flagがTrueなら、プログレスリングの動作をやめ、「アップロード成功」と表示する。「facebookにアップロード」アイコンの使用を可能にする。それ以外の場合は「アップロード失敗」と表示して、「facebookにアップロード」アイコンの使用を可能にする。
今回は、ここまでだ。また次回の記事でお会いしよう。次回は、指定したフォルダー内の画像を、スライド形式で表示させる方法を紹介する。
本コンテストでは、2013年9月1日〜12月1日に新たにWindowsストアに新規公開されたアプリを募集します。入賞したアプリの製作者には、総額130万円の賞金が授与されますので、ふるってご応募ください。
PROJECT KySS 薬師寺 国安(やくしじ くにやす)
1950年生まれ。フリーVBプログラマ。高級婦人服メーカーの事務職に在職中、趣味でVBやActiveXに取り組み、記事を執筆。2003年よりフリー。.NETやRIAに関する執筆多数。Windowsストアアプリも多数公開中(約270本)。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
PROJECT KySSは、1997年に薬師寺聖と結成したコラボレーション・ユニット
Copyright © ITmedia, Inc. All Rights Reserved.