国内ニュースの取得・表示と、人名から画像検索を行う2つのサンプルをつくる

次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト2のコードを記述します。
ロジックコードを記述する
リスト2 (MainWindow.xaml.vb)
最新の HTTP アプリケーション用のプログラミングインターフェイスを提供するクラスの含まれる、System.Net.Http名前空間をインポートします。
Imports System.Net.Http
ファイル、フォルダおよびアプリケーションの設定を管理するクラスの含まれる、Windows.Storage名前空間をインポートします。
Imports Windows.Storage
シーケンシャルアクセスストリームおよびランダムアクセスストリームに対する読み取りと書き込みをサポートするクラスの含まれる、Windows.Storage.Streams名前空間をインポートします。
Imports Windows.Storage.Streams
コンテキストメニューおよびメッセージダイアログのサポートを提供するクラスの含まれる、Windows.UI.Popups名前空間をインポートします。
Imports Windows.UI.Popups Public NotInheritable Class MainPage Inherits Page
BitmapImage型の新しいリストであるImageListオブジェクトを作成します。
Dim ImageList As New List(Of BitmapImage)
[OK]ボタンがタップされた時の処理
WatermarkTextBoxが未入力の場合は処理を抜けます。入力された場合は以下の処理を実行します。
変数myUrlに
String.Format("http://api.photozou.jp/rest/search_public?type=photo&keyword={0}", Uri.EscapeDataString(WatermarkTextBox1.Text))
と指定し、keywordに文字列をエスケープ表現に変換したWatermarkTextBox1の値を指定します。
HttpClientの新しいインスタンスmyHttpClientオブジェクトを作成します。
GetStringAsyncメソッドで、指定URIにGET要求を送信し、非同期操作で応答本体を文字列として取得し、変数resultに格納します。
XElement.Parseメソッドで変数resultの値を文字列として読み込みます。
Descendatsメソッドですべての
新しいImageのインスタンスmyImageオブジェクトを作成します。
WidthとHeightにはDouble.NaNを指定します。これはAutoを指定したのと同じ意味になります。
Sourceプロパティに
ImageListオブジェクトにAddメソッドでmyImage.Sourceを追加しておきます。
GridViewにAddメソッドでmyImageオブジェクトを追加します。画像の一覧が表示されます。
非同期処理で行われるためメソッドの先頭にAsyncを追加します。
Private Async Sub okButton_Click(sender As Object, e As RoutedEventArgs) Handles okButton.Click
If WatermarkTextBox1.Text = String.Empty Then
Exit Sub
Else
Image1.Source = Nothing
ImageList.Clear()
GridView1.Items.Clear()
Dim myUrl = String.Format("http://api.photozou.jp/rest/search_public?type=photo&keyword={0}", Uri.EscapeDataString(WatermarkTextBox1.Text))
Dim myHttpClient As New HttpClient
Dim result = Await myHttpClient.GetStringAsync(New Uri(myUrl, UriKind.Absolute))
Dim xmldoc As XElement = XElement.Parse(result)
For Each result In From c In xmldoc.Descendants("photo") Select c.Element("image_url").Value
Dim myImage As New Image
myImage.Width = Double.NaN
myImage.Height = Double.NaN
myImage.Source = New BitmapImage(New Uri(result, UriKind.Absolute))
ImageList.Add(myImage.Source)
GridView1.Items.Add(myImage)
Next
End If
End Sub
GridViewから画像が選択された時の処理
Image1のSourceプロパティに、myImage.Sourceを格納しているImageListから、GridViewから選択された画像のインデックスに対応する画像を指定します。これで、Image1に実寸の画像が表示されます。
[Save]アイコンの使用を可能にします。
Private Sub GridView1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles GridView1.SelectionChanged
Try
Image1.Source = ImageList(GridView1.SelectedIndex)
saveButton.IsEnabled = True
Catch
Exit Sub
End Try
End Sub
[Save]アイコンがタップされた時の処理
ピクチャライブラリにアクセスします。
CreateFolderAsyncメソッドでピクチャライブラリ内にWebSaveImageというサブフォルダを作成します。
CreationCollisionOption.OpenIfExistsと指定すると、同名フォルダが存在する場合はフォルダ名を返し、ない場合は新規に作成します。
Image1.SourceをDirectCastでBitmapImageにキャストして変数mySourceに格納します。
変数mySourceUriでBitmapImageを生成したグラフィックスソースファイルのURIを取得します。
新しいHttpClientのインスタンスmyHttpClientオブジェクトを作成します。
GetStreamAsyncメソッドで、指定したURIにGET要求を送信し、非同期操作で応答本体をストリームとして受け取り、変数myGetFileで参照します。
WebSaveImageサブフォルダ内にCreateFileAsyncメソッドで現在の年月日時分秒.jpgファイルを作成します。
OpenAsyncメソッドで現在の年月日時分秒.jpgファイルを「読み取り/書き込み」モードで開きます。
CopyAndCloseAsyncメソッドで、ソースストリーム(myGetFile.AsInputStream)をコピー先ストリーム(myStream.GetOutputStreamAt(0))にコピーし、コピー操作が完了するまで待機します。
AsInputStreamで、myGetFileをランダムの入力ストリームに変換します。
GetOutputStreamAtはストリームの指定された場所の出力ストリームを返します。
保存した旨のメッセージを表示し、[Save]ボタンの使用を不可とします。
Private Async Sub saveButton_Click(sender As Object, e As RoutedEventArgs) Handles saveButton.Click
Dim myFolder As StorageFolder = Windows.Storage.KnownFolders.PicturesLibrary
Dim mySubFolder = Await myFolder.CreateFolderAsync("WebSaveImage", CreationCollisionOption.OpenIfExists)
Dim mySource = DirectCast(Image1.Source, BitmapImage)
Dim mySourceUri = mySource.UriSource
Dim myHttpClient As New HttpClient
Dim myGetFile As Stream = Await myHttpClient.GetStreamAsync(mySourceUri)
Dim myStorageFile = Await mySubFolder.CreateFileAsync(DateTime.Now.ToString("yyyy年MM月dd日HH時mm分ss秒") & ".jpg", CreationCollisionOption.OpenIfExists)
Using myStream = Await myStorageFile.OpenAsync(FileAccessMode.ReadWrite)
Await RandomAccessStream.CopyAndCloseAsync(myGetFile.AsInputStream, myStream.GetOutputStreamAt(0))
End Using
Dim myMessage As New MessageDialog("ピクチャライブラリのWebSaveImageフォルダに保存しました。")
Await myMessage.ShowAsync
saveButton.IsEnabled = False
End Sub
End Class
以上で今回の2つのサンプル解説は終了です。ありがとうございました。
筆者からのお知らせ
筆者はWindowsストアでアプリを公開しています。チャームの検索からWindowsストアを選択して、検索欄に、kuniyasuまたはYakushijiKuniyasuと入力すると、公開されているアプリの一覧が表示されます。上記はどちらも私のアカウントですので、興味のある方は是非ダウンロードして使ってみてください。
RSSから国内ニュースを取得してタイルに表示するプログラム


