RSSの読み込み表示とページ遷移時のパラメータの渡し方を知る

2012年10月31日(水)
薬師寺 国安

ロジックコードを記述する

リスト3 (MainWindow.xaml.vb)

Option Strict On

HTTP アプリケーション用のプログラミングインターフェイスを提供するクラスの含まれる、System.Net.Http名前空間をインポートします。

Imports System.Net.Http

DataInfoクラス内に文字列型の、「title」「description」「link」プロパティを定義しておきます。

Public Class DataInfo
  Property title As String
  Property description As String
  Property link As String
End Class

Public NotInheritable Class MainPage
  Inherits Page

ページがアクティブになった時の処理

HttpClientクラスの新しいインスタンスmyHttpClientオブジェクトを作成します。HttpClientクラスは、URI で識別されるリソースに HTTP 要求を送信し、そのリソースから HTTP 応答を受信するためのクラスです。

「http://www.microsoft.com/japan/msdn/rss/feed/rss.aspx」のUriで初期化された新しいUriオブジェクトmyUriを作成しておきます。このUriにRSSの情報が記載されています(RSSの構造については図4参照)。

HttpClientクラスのGetStringAsyncメソッドで、指定したURIにGET送信し、非同期操作で応答本体を文字列として受け取り、変数resultに格納します。非同期処理の場合は、メソッドの最初にAsyncを追加します。

Protected Overrides Async Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)

のAsyncの部分を追加する必要があります。しかし、このAsyncの追加を忘れても、非同期処理のメソッドを使った場合、自動的にエラーが表示され、「含まれているスコープを’Async’にします」と表示され、その個所をクリックすると自動的にAsyncが頭に追加されます(図5参照)。VS2012の素晴らしい点です!

XElement.Parseメソッドで、文字列として読み込まれたXMLのRSS(図4参照)を読み取ります。

DataInfoクラス型の新しいリストである、myDataInfoオブジェクトを作成します。

読み込んだXML文書内から、Descendants メソッドで、子孫要素であるすべての 要素のコレクションに対して、各要素を変数 myResult に格納しながら、以下の処理を行います。

DataInfoクラスの「title」プロパティに

要素の値を指定します。「description」プロパティに<description>要素の値を指定します。「link」プロパティに<link />要素の値を指定します。これらのプロパティの設定されたDataInfoをAddメソッドでリストであるmyDataInfoオブジェクトに追加します。 <p>ListBoxのItemsSourceプロパティにmyDataInfoオブジェクトを指定します。これで、「タイトル」と「概要」がListBox内に表示されます。</p> <pre class="brush: plain; " type="syntaxhighlighter"> Protected Overrides Async Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) Dim myHttpClient As New HttpClient Dim myUri As Uri = New Uri("http://www.microsoft.com/japan/msdn/rss/feed/rss.aspx", UriKind.Absolute) Dim result = Await myHttpClient.GetStringAsync(myUri) Dim xmldoc As XElement = XElement.Parse(result) Dim myDataInfo As New List(Of DataInfo) For Each myResult In From c In xmldoc.Descendants("item") Select c With myDataInfo .Add(New DataInfo With {.title = myResult.Element("title").Value, .description = myResult.Element("description").Value, .link = myResult.Element("link").Value}) End With Next ListBox1.ItemsSource = myDataInfo End Sub </pre> <h4>ListBox内の項目が選択された時の処理</h4> <p>ListBoxから選択された項目の、linkプロパティの値を変数myUrlに格納します。〔戻る〕ボタンの使用を可能にし、FameのNavigateメソッドで、myUrlを引数にWebViewPageに遷移します。</p> <pre class="brush: plain; " type="syntaxhighlighter"> Private Sub ListBox1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ListBox1.SelectionChanged myFrame.Visibility = Windows.UI.Xaml.Visibility.Visible Dim myUrl = DirectCast(ListBox1.SelectedItem, DataInfo).link backButton.IsEnabled = True myFrame.Navigate(GetType(WebViewPage), myUrl) End Sub </pre> <h4>〔戻る〕ボタンがクリックされた時の処理</h4> <p>Frameコントロールを非表示にします。</p> <pre class="brush: plain; " type="syntaxhighlighter"> Private Sub backButton_Click(sender As Object, e As RoutedEventArgs) Handles backButton.Click myFrame.Visibility = Windows.UI.Xaml.Visibility.Collapsed End Sub End Class </pre> <div class="imagebox"><a href="/sites/default/files/articles/376704.png" target="_blank"><img alt="" src="/sites/default/files/articles/376704.png" width="400" /></a> <div class="caption">図4:http://www.microsoft.com/japan/msdn/rss/feed/rss.aspx のRSSの構造一部。使用するのは、各<item>要素内の、<title><description><link />の3つの要素(クリックで拡大)</description>
図5:「含まれているスコープを’Async’にします」のメッセージが表示されるので、その個所をクリックする(クリックで拡大)

次に、ソリューションエクスプローラー内のWebViewPage.xamlを展開して表示される、WebViewPagexaml.vbをダブルクリックしてリスト4のコードを記述します。

ロジックコードを記述する

リスト4 (WebViewPage.xaml.vb)

Option Strict On
Public NotInheritable Class WebViewPage
  Inherits Page

ページがアクティブになった時の処理

MainPage.xamlから渡された値(e.Parameter)を文字列に変換して、変数myUriに格納します。

WebViewのNavigateメソッドで変数myUriに格納されたページに遷移します。絶対URIで指定します。

  Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    Dim myUrl = CStr(e.Parameter)
    WebView1.Navigate(New Uri(myUrl, UriKind.Absolute))
  End Sub
End Class

このサンプルは「デバッグなしで開始」で実行してください。筆者の環境だけかもしれませんが、「デバッグ開始」を実行するとJust-In-Timeのエラーが発生します。Just-In-Timeのチェックを外してもエラーになりますので、「デバッグなしで開始」での実行をお願いします。

「デバッグなしで開始」では問題なく動作します。

  • Windows ストアアプリでRSSを読み込み表示するサンプル

  • ページを遷移する際にパラメータを渡すサンプル

薬師寺国安事務所

薬師寺国安事務所代表。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メルマガ会員のサービス内容を見る

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