画像の削除にあわせて自動的に並び替え+1つのサンプル

2013年1月18日(金)
薬師寺 国安

次に、ソリューションエクスプローラー内の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
  • サーバーからの画像を取得するWindows8サンプルアプリ

  • 画像が削除された際自動的に並び変わるWindows8サンプルアプリ

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

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)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

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