Windows 8 Store Applicationプログラミング(基本編) 12

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

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

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

リスト2 (MainWindow.xaml.vb)

Option Strict On

シーケンシャルとランダムアクセスのストリームの読み書きを提供するクラスの含まれる、Windows.Storage.Streams名前空間をインポートします。

Imports Windows.Storage.Streams

ネットワークで使用される多くのプロトコルに対し、単純なプログラミングインターフェースを提供するクラスの含まれる、System.Net名前空間をインポートします。

Imports System.Net

ファイル、フォルダ、およびアプリケーションの設定を管理するクラスの含まれる、Windows.Storage名前空間をインポートします。

Imports Windows.Storage

XMLドキュメントモデル(DOM)をサポートするクラスの含まれる、Windows.Data.Xml.Dom名前空間をインポートします。

Imports Windows.Data.Xml.Dom

Public NotInheritable Class MainPage
  Inherits Page

[サーバーから画像を取得]ボタンがクリックされた時の処理

GridViewコントロール内をクリアしておきます。ドキュメントライブラリにアクセスします。「CountDownControlでカメラのシャッターを切る」の中でドキュメントライブラリに置いていたImageFileList.xmlをGetFileAsyncメソッドで取得し、ファイルを表す変数myXmlFileで参照しておきます。
ImageFileList.xmlには、「CountDownControlでカメラのシャッターを切る」サンプル内で、画像をサーバーにアップするごとに、アップした画像のファイル名が保存されています。

XMLドキュメントの読み込みと、解析の際に使用される設定の含まれる、XmlLoadSettingsクラスの新しいインスタンス、mySettingオブジェクトを作成します。DTDは含めないので、ProhibitDtdプロパティにFalseと指定します。外部エンティティ参照もしませんので、ResolveExternalsプロパティにFalseと指定します。

XmlDocumentクラスのLoadFromFileAsyncメソッドで、指定されたファイルからXMLドキュメントを非同期的に読み込みます。ドキュメントは指定された設定を使用して解析されます。

読み込んだXMLファイルのノードを取得します。SelectNodesメソッドで要素のノードリストを取得し、ImageElement変数で参照します。要素のノードの個数分反復処理を行います。ImageElement.Count-1としているのは、繰り返し変数iが0から始まるためです。

変数iに対応する要素を取得していきます。ElementAt(i)メソッドはiの位置にある要素を返すメソッドです。これでファイル名が順次取得されていきます。

「CountDownControlでカメラのシャッターを切る」でサーバーにアップしていたImageFileUploadのImageDataというフォルダ内のmyElement変数に該当する画像ファイル名を、変数myUrlに格納していきます。

HttpWebRequest.CreateHttpメソッドで、指定したURI文字列用に、新しいHttpWebRequestインスタンスを初期化します。HttpWenRequestクラスは、WebRequestクラスの HTTP 固有の実装を提供するクラスです。
MethodプロパティにGETを指定します。HttpWebRequestクラスのGetResponseAsyncメソッドで、インターネット要求への応答を非同期で受け取り、WebResponseクラスのmyResponse変数で参照します。WebResponseクラスは、URIからの応答を利用できるようにするクラスです。

WebResponseクラスのGetResponseStreamメソッドで、インターネットストリームからのデータストリームを取得し、Stream変数myStreamで参照します。

メモリーに保存される入出力ストリームデータへのランダムアクセスを提供するクラスである、InMemoryRandomAccessStreamの新しいインスタンスmyMemoryオブジェクトを作成します。

GetOutputStreamAt(0)メソッドで、ストリームの指定された場所の出力ストリームを取得し、IOutputStream型の変数myOutPutで参照します。IOutputStreamインターフェースは書きこまれる順次バイトストリームを表します。

RandomAccessStream.CopyAsyncメソッドで、ソースストリーム(myStream.AsInputStream)を、コピー先のストリーム(myOutPut)にコピーします。RandomAccessStreamクラスは、入出力ストリームデータへのランダムアクセスを提供するクラスです。AsInputStreamメソッドは、Windows ストアアプリ用の.NETマネージストリームを、Windowsランタイムの入力ストリームに変換します。

BitmapImageクラスの新しいインスタンス、bmpオブジェクトを作成します。SetSourceプロパティに出力ストリームを参照しているmyMemoryオブジェクトを指定します。Imageの新しいインスタンスmyImageオブジェクトを作成し、WidthとHeightを指定します。Sourceプロパティにbmpオブジェクトを指定し、GridViewにAddメソッドで追加します。これで、横一列にサーバーにアップしている画像の一覧が表示されます。

非同期で処理が行われるため、メソッドの先頭にAsyncを追加します。

  Private Async Sub Button1_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click
    GridView1.Items.Clear()
    Dim myStorageFolder As StorageFolder = Windows.Storage.KnownFolders.DocumentsLibrary
    Dim myXmlFile As StorageFile = Await myStorageFolder.GetFileAsync("ImageFileList.xml")
    Dim mySetting As New XmlLoadSettings
    mySetting.ProhibitDtd = False
    mySetting.ResolveExternals = False
    Dim xmldoc = Await XmlDocument.LoadFromFileAsync(myXmlFile, mySetting)
    Dim ImageElement As XmlNodeList = xmldoc.SelectNodes("//画像名")
 
    For i As Integer = 0 To ImageElement.Count - 1
      Dim myElement = ImageElement.ElementAt(i).InnerText
      Dim myUrl = "ユーザーのサーバー/ImageFileUpload/ImageData/" &myElement
      Dim myRequest As HttpWebRequest = HttpWebRequest.CreateHttp(myUrl)
      myRequest.Method = "GET"
      Using myResponse As WebResponse = Await myRequest.GetResponseAsync
  
        Using myStream As Stream = myResponse.GetResponseStream
          Dim myMemory As New InMemoryRandomAccessStream
          Dim myOutput As IOutputStream = myMemory.GetOutputStreamAt(0)
          Await RandomAccessStream.CopyAsync(myStream.AsInputStream, myOutput)
          Dim bmp As New BitmapImage
          bmp.SetSource(myMemory)
          Dim myImage As New Image
          myImage.Width = 640
          myImage.Height = 480
          myImage.Source = bmp
          GridView1.Items.Add(myImage)
        End Using
      End Using
    Next
  End Sub
End Class

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る