Windows 8のタイルに地震情報を表示するプログラムを作る

2013年4月22日(月)
薬師寺 国安

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

リスト3 (MainWindow.xaml.vb)

Option Strict On

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

Imports System.Net.Http

コンテキストメニューおよびメッセージダイアログのサポートを提供するクラスの含まれる、Windows.UI.Popups名前空間をインポートします。

Imports Windows.UI.Popups

EarthQuakeInformationというクラス内に、文字列型のtitle、description、linkといったプロパティを定義しておきます。

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

Public NotInheritable Class MainPage
  Inherits Page

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

変数myUrlにtenki.jpで提供されているRSSのURLを格納しておきます。このRSSは図6のような構造になっています。

図6:tenki.jpのRSSの構造。使用するのは赤い枠で囲まれた要素の値(クリックで拡大)

新しいHttpClientのインスタンス、myHttpClientオブジェクトを作成します。
GetStringAsyncメソッドで、指定したURIにGET要求を送信し、非同期操作で応答本体を文字列として取得します。取得した値を変数myResultに格納しておきます。
図6を見るとわかりますが、ルート要素が、xmlns:tenkiJP="http://tenki.jp/ns/rss/2.0という名前空間を参照しています。また、version=”2.0”と宣言されています。
名前空間を参照していると要素の中身を取り出しにくいので、名前空間とversionを置換してというルート要素に置き換えています。
置換したXMLの内容をXElement.Parseメソッドで文字列として読み込みます。

まずは地震の発生した日付を取得します。日付は要素の中身になります。ここには時間まで含まれているので、Substring関数で最初から16文字だけを取り出します。すると曜日、日、月、年のみを取得できます。
新しいリストである、EarthQuakeInformationクラスのインスタンス、myEarthQuakeInfomationオブジェクトを作成します。

Descendantsメソッドで全ての子孫要素を選択するクエリを定義し、Countプロパティでその個数を取得します。要素がない場合は、地震の情報がないということになりますので、メッセージを表示して処理を抜けます。要素が存在する場合は以下の処理を行います。

Descendantsメソッドで、全ての子孫要素内の要素を変数resultに格納しながら、以下の処理を反復します。
EarthQuakeInformationクラスのtitleプロパティに要素の値を、descriptionプロパティに<description>要素の値を、linkプロパティに<link />要素の値を指定して、AddメソッドでmyEarthQuakeInfomationオブジェクトに追加していきます。<br /> GridViewのItemsSourceプロパティにmyEarthQuakeInfomationオブジェクトを追加します。<br /> これで、地震の「タイトル」と「概要」がタイルに表示されます。TitleTextBoxに発生した地震の日付を表示します。</description>

非同期処理で行われるため、メソッドの先頭にAsyncを追加します。

  Protected Overrides Async Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    Dim myUrl = "http://feed.tenki.jp/component/static_api/rss/earthquake/recent_entries_by_day.xml"
    Dim myHttpClient As New HttpClient
    Dim myResult As String = Await myHttpClient.GetStringAsync(myUrl)
    myResult = myResult.Replace("<rss version=" &ChrW(34) & "2.0" &ChrW(34) & " xmlns:tenkiJP=" &ChrW(34) & "http://tenki.jp/ns/rss/2.0" &ChrW(34) & ">", "<rss>")
    myResult = myResult.Replace("tenkiJP:earthquake epicenter", "earthquake epicenter")
    Dim xmldoc As XElement = XElement.Parse(myResult)

    Dim myDate As String = xmldoc.Descendants("lastBuildDate").Value
    Dim earthDate As String = myDate.Substring(0, 16)
    Dim myEarthQuakeInfomation As New List(Of EarthQuakeInfomation)
    For Each result In From c In xmldoc.Descendants("item") Select c
      With myEarthQuakeInfomation
        .Add(New EarthQuakeInfomation With {.title = result.Element("title").Value, .description = result.Element("description").Value, .link = result.Element("link").Value})
      End With
    Next
    GridView1.ItemsSource = myEarthQuakeInfomation
    TitleTextBlock.Text = earthDate& " の地震"
  End Sub

GridViewの項目が選択された時の処理

変数myUrlに、GridViewから選択された項目を、EarthQuakeInfomationクラスにキャストして、そのlinkプロパティの値を取得して格納します。取得したUrlを引数にWebBrowserPageに遷移します。

  Private Sub GridView1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles GridView1.SelectionChanged
    Try
      myFrame.Visibility = Windows.UI.Xaml.Visibility.Visible
      Dim myUrl As String = DirectCast(GridView1.SelectedItem, EarthQuakeInfomation).link
      myFrame.Navigate(GetType(WebBrowserPage), myUrl)
    Catch
      myFrame.Visibility = Windows.UI.Xaml.Visibility.Collapsed
    End Try
  End Sub

←アイコンがクリックされた時の処理

WebBrowserPageを表示しているmyFrameを非表示にします。

  Private Sub backButton_Click(sender As Object, e As RoutedEventArgs) Handles backButton.Click
    myFrame.Visibility = Windows.UI.Xaml.Visibility.Collapsed
  End Sub
End Class

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

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

リスト4 (WebBrowserPage.xaml.vb)

Option Strict On
Public NotInheritable Class WebBrowserPage
  Inherits Page

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

MainPage.xamlから渡された引数(Url)は、e.Parameterで取得できます。これはObject型であるため、DirectCastでString型にキャストして、変数myUriに格納します。

WebBrowserのSourceプロパティにmyUriの値を指定します。これでWebBrowser内に該当する地震のページが表示されます。

  Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    Dim myUri As String = DirectCast(e.Parameter, String)
    WebBrowser1.Source = New Uri(myUri, UriKind.Absolute)
  End Sub
End Class

今回はここまでです。ありがとうございました。

筆者からのお知らせ

筆者はWindowsストアでアプリを公開しています。チャームの検索からWindowsストアを選択して、検索欄に、kuniyasuまたはYakushijiKuniyasuと入力すると、公開されているアプリの一覧が表示されます。上記はどちらも私のアカウントですので、興味のある方は是非ダウンロードして使ってみてください。

  • Windows 8のタイルに地震情報を表示するプログラムサンプル

薬師寺国安事務所

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

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