国内ニュースの取得・表示と、人名から画像検索を行う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から国内ニュースを取得してタイルに表示するプログラム