サーバー上の画像取得とRSSのデータを表示する

去る2011年07月27日にKDDIより、「最新版Windows Phone搭載「IS12T」がauから秋に発売」と発表されました。9月以降の発売になるようです。詳細については下記のページを参照してください。
→参照:最新版Windows Phone搭載「IS12T」がauから秋に発売(MSN)
また、デバイス情報については下記のページを参照してください。
→参照:Windows Phone デバイス情報(Microsoft)
これで、いよいよ日本での発売が現実のものとなりました。是非皆さんで盛り上げていきましょう。
さて、今回は、サーバー上の画像を読み込んで表示する方法と、RSSのデータを読み込み表示する、2つのサンプルについて解説します。
サーバー上の画像を取得する
最初は、「サーバー上の画像を取得する」サンプルです。このプログラムで実装する機能の動作を、下記に解説しておきます。
エミュレーター上に表示された項目を選択すると、該当する画像が表示されます。項目を選択した時TiltEffect機能が働きます。TiltEffect機能については、第4回の「TiltEffectによる視覚的効果」を参照してください。これらの画像はローカルにある画像ではなく、筆者の専用サーバーに置いた画像です。「エラー」を選択すると、画像のダウンロードに失敗しエラーと表示されます(図1)。
| 図1:表示された項目を選択すると(左図)、該当する画像が表示される(中央図)。「エラー」を選択するとダウンロードエラーが表示される(右図)(クリックで拡大) |
サンプル一式は、会員限定特典としてダウンロードできます。記事末尾をご確認ください。
※サンプル実行でエラーが発生した場合は、「ソリューションのビルド」を実行後、再度、デバッグ開始を行ってください。
プロジェクトの作成
VS 2010のメニューから[ファイル(F)/新規作成(N)/プロジェクト(P)]を選択します。次に、「Windows Phone Application」を選択して、「名前(N)」に任意のプロジェクト名を指定します。ここでは「WP7_ImageDownload」という名前を付けています。Windows Phoneのバージョンは7.0を選択します。
ソリューションエクスプローラー内にリスト1のXML文書ファイル(FileName.xml)を追加しておきます。
XML文書ファイルをLINQ to XMLで処理するため、VS2010メニューの「プロジェクト(P)/参照の追加(R)」と選択してSystem.Xml.Linqを追加しておいてください。
ダウンロードされたサンプルプログラムにはXML文書ファイルは追加済みです。
リスト1 XML文書ファイル(FileName.xml)
<?xml version="1.0" encoding="utf-8" ?> <画像ファイル> <タイトル>kuniyasu</タイトル> <タイトル>銀杏</タイトル> <タイトル>民家</タイトル> <タイトル>光</タイトル> <タイトル>エラー</タイトル> </画像ファイル>
MainPage.xamlの編集とコントロールの追加
x:NameがPageTitleのTextBlockのTextプロパティに「項目を選択」と指定しておきます。
ツールボックスからエミュレーターデザイン画面上にListBoxとImageコントロールを、1個ずつ配置します。ListBoxコントロールを選択し、プロパティウィンドウの[その他]パネルにあるBorderThicknessに5を指定して、枠線を少し太くします。[ブラシ]パネルにあるBackgroundにSilverを指定して背景色を設定します。枠線の色を指定するBorderBrushにはGoldを指定します(図2)。ImageコントロールのWidthに320、Heightに240と指定します。図3のように配置します。
|
|
| 図2:ListBoxコントロールのプロパティを設定する |
| 図3:ListBoxとImageコントロールを配置した(クリックで拡大) |
ListBox内の項目を選択した時、TiltEffect機能が働き、項目が一瞬傾いたような動作をします。このTiltEffect機能を有効にする方法は、第4回の「TiltEffectによる視覚的効果」で解説していますので、そちらを参照してください。
書き出されるXAMLコードにlocal:TiltEffect.IsTiltEnabled="True"と指定しています(リスト2)。
リスト2 (MainPage.xaml)
(1)localという名前空間を定義しています。値にはControlTiltEffectを指定します。第4回の「TiltEffectによる視覚的効果」を参照してください。
(2)TiltEffect効果を有効にするため、local:TiltEffect.IsTiltEnabled="True"と指定します。第4回の「TiltEffectによる視覚的効果」を参照してください。
<phone:PhoneApplicationPage
x:Class="WP7_ImageDownload.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ControlTiltEffect;assembly=ControlTiltEffect" ■(1)
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True"
xmlns:my="clr-namespace:Microsoft.Phone.Controls.Maps.Overlays;assembly=Microsoft.Phone.Controls.Maps" local:TiltEffect.IsTiltEnabled="True"> ■(2)
~コード略~
</phone:PhoneApplicationPage>
ソリューションエクスプローラー内のMainPage.xamlを展開し、表示されるMainPage.xaml.vbをダブルクリックしてリスト3のロジックコードを記述します。
ロジックコードを記述する
リスト3 (MainPage.xaml.vb)
Option Strict On
LINQ to XMLを利用するクラスの含まれる、System.Xml.Linq名前空間をインポートします。
Imports System.Xml.Linq
画像を表示するクラスの含まれる、System.Windows.Media.Imaging名前空間をインポートします。
Imports System.Windows.Media.Imaging
Partial Public Class MainPage
Inherits PhoneApplicationPage
' Constructor
Public Sub New()
InitializeComponent()
End Sub
ページが読み込まれた時の処理
XElement.Loadメソッドでリスト1のXML文書ファイルを読み込みます。
文字列型のリストであるtitleListオブジェクト変数を宣言します。
<タイトル>要素のコレクションに対して、各要素を変数 result に格納しながら、リストであるtitleListオブジェクトにAddメソッドで<タイトル>要素の内容を追加していきます。
ListBoxのItemsSourceプロパティにtitleListオブジェクトを指定します。これで、ListBoxにタイトルの一覧が表示されます。
Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
Dim xmldoc As XElement = XElement.Load("FileName.xml")
Dim titleList As New List(Of String)
For Each result In From c In xmldoc.Descendants("タイトル") Select c
titleList.Add(result.Value)
Next
ListBox1.ItemsSource = titleList
End Sub
ListBoxから項目が選択された時の処理
x:NameがPageTitleのTextBlockにListBoxより選択された項目名を表示します。
ListBoxより選択された項目名に、文字列の”.jpg”を連結して、変数dlImageNameに格納します。
新しい、WebClientのインスタンス、myWebClientを生成します。WebClientクラスはSystem.Net名前空間に属し、URI で識別されるリソースとの間でデータを送受信する共通メソッドを提供するクラスです。
OpenReadAsyncメソッドで、指定したURI(筆者のサーバーアドレスを連結)の画像ファイルを開きます。絶対URIで指定します。OpenReadAsyncメソッドは、指定したリソースに対する読み取り可能なストリームを開くメソッドです。
AddHandlerメソッドで、OpenReadCompletedイベントハンドラを追加します。OpenReadCompletedイベントは、非同期のリソース読み取り操作の完了時に発生します。
OpenReadCompletedイベント内では以下の処理を行います。
リソースの読み取りに失敗した場合は、エラーメッセージボックスを表示させます。
リソースの読み取りに成功した場合は、BitmapImageのインスタンスであるmyImageオブジェクトのSetSourceメソッドに、読み取った結果(画像ファイル)を指定します。ImageコントロールのSourceプロパティに、画像ファイルのセットされたmyImageオブジェクトを指定します。これで、選択した項目に該当する画像がサーバーから読み取られて表示されます。
Private Sub ListBox1_SelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox1.SelectionChanged
PageTitle.Text = ListBox1.SelectedItem.ToString
Dim dlImageName As String = ListBox1.SelectedItem.ToString & ".jpg"
Dim myWebClient As New WebClient
AddHandler myWebClient.OpenReadCompleted, Sub(resultSender As Object, resultArgs As OpenReadCompletedEventArgs)
If resultArgs.Error Is Nothing = False Then
MessageBox.Show("ダウンロードエラー")
Image1.Source = Nothing
Exit Sub
Else
Dim myImage As New BitmapImage
myImage.SetSource(resultArgs.Result)
Image1.Source = myImage
End If
End Sub
myWebClient.OpenReadAsync(New Uri("http://2008r2.projectkyss.net/Image/" & dlImageName, UriKind.Absolute))
End Sub
End Class
「サーバー上の画像取得とRSSのデータを表示する」サンプルプログラム_1
「サーバー上の画像取得とRSSのデータを表示する」サンプルプログラム_2





