Windows Phone 7.5 で、WebClient を使用してXMLを読み込み表示するサンプルを探していたら、
以下の Microsoft の公式ページにありました。
ということで、実際にソースコードを作成して試してみました。
以下、ソースコードの解説です。
※オリジナルのソースコードに書かれていないコメントなどを追記しています
ソースコード解説
アプリケーションを起動すると、MainPage のコンストラクタが呼び出されます。
※MainPage はウィザードで自動的に作成される PhoneApplicationPage クラスのサブクラス
コンストラクタでは、独自に定義した GetTweets メソッドを呼び出し、指定したユーザの TL を表示しています。
// コンストラクタ
public MainPage()
{
InitializeComponent();
// 指定したユーザーのタイムラインを表示する
GetTweets(TwitterId);
}
コンストラクタから呼び出された GetTweets メソッドでは、
指定された文字列を検索するための Twitter API の URI 文字列を作成し、
WebClient クラスを使用して非同期読み込みを開始しています。
// 指定したユーザのタイムラインを取得して表示する
private void GetTweets(string strId)
{
// Twitterで検索する文字列を作成
String queryString = HttpUtility.UrlEncode(strId); // URLで使用できる文字列に変換
// TwitterAPIのURIを作成
String uriString = "http://search.twitter.com/search.atom?q=" + queryString;
// Uriインスタンス生成
Uri u = new Uri(uriString);
WebClient cli = new WebClient();
// ダウンロード完了後に呼び出されるイベントハンドラを設定
cli.DownloadStringCompleted += new DownloadStringCompletedEventHandler(cli_DownloadStringCompleted);
// 指定したURIを非同期でダウンロード
cli.DownloadStringAsync(u);
}
非同期読み込みが完了すると、DownloadStringCompleted に設定したイベントハンドラが呼び出されます。
ダウンロードしたデータ(文字列)から XML のインスタンスを生成し、データコンテキストに設定しています。
// 通信を実行し、結果を画面に表示する
void cli_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
// 指定したURIから読み込んだ文字列を取得
String stringResult = e.Result;
// 指定した文字列から StringReader(StringReader は TextReader のサブクラス)
StringReader sr = new StringReader(stringResult);
// 指定した TextReader を使用して、新しい XmlReader インスタンスを作成する
XmlReader xr = XmlReader.Create(sr);
// 指定した XmlReader から配信フィードを読み込む
SyndicationFeed sf = SyndicationFeed.Load(xr);
// 読み込んだ配信フィードをデータコンテキストに設定
this.DataContext = sf;
} else
{
MessageBox.Show("通信エラーが発生しました。\r\n" + e.Error.Message);
}
}
データコンテキストにデータを設定すると、データバインディングにより自動的に、
XAML に定義していたオブジェクトのプロパティに値が設定、再描画されます。
この例では Twitter API で取得した以下のデータをデータバンディングさせています。
- Links[1].Uri ・・・ツイートしたアカウントのプロフィール画像のURI
- Authors[0].Name ・・・ツイートしたアカウントの名前
- Title.Text ・・・ツイート本文
※Twitter API - GET search の仕様は GET search | Twitter Developers にあります。
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="SyndicationItemTemplate">
<StackPanel Orientation="Horizontal" Width="460">
<Image Height="91" Width="91" Source="{Binding Links[1].Uri}" Margin="4"/>
<StackPanel Orientation="Vertical" Width="350">
<TextBlock Text="{Binding Authors[0].Name}" FontWeight="Bold" >
<TextBlock.Foreground>
<SolidColorBrush Color="{StaticResource PhoneAccentColor}"/>
</TextBlock.Foreground>
</TextBlock>
<TextBlock TextWrapping="Wrap" Text="{Binding Title.Text}" />
</StackPanel>
</StackPanel>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
このサンプルで使用されている主なクラスのドキュメントへのリンク
- PhoneApplicationPage クラス (Microsoft.Phone.Controls)
- WebClient クラス (System.Net)
- DownloadStringCompletedEventArgs クラス (System.Net)
- HttpUtility クラス (System.Web)
- Uri クラス (System)
- StringReader クラス (System.IO)
- XmlReader クラス (System.Xml)
- SyndicationFeed クラス (System.ServiceModel.Syndication)
- FrameworkElement.DataContext プロパティ (System.Windows)
