[OK]ボタンがタップされた時の処理

WatermarkTextBoxに入力がなかった場合は処理を抜けます。入力があった場合は以下の処理を行います。
変数myUriに

String.Format("http://api.postalcode.jp/v1/zipsearch?word={0}&format=xml", WatermarkTextBox1.Text)

と指定して、wordにWatermarkTextBoxに入力された値を指定します。
Formatにはxmlを指定していますので、返される結果はXMLデータとなります。例えばWatermarkTextBoxに「愛媛県松山市道後」と入力すると図6のようなXMLが返されます。

図6:「愛媛県松山市道後」と入力して返されるXMLデータ(一部)(クリックで拡大)

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

指定URIにGET要求を送信し、非同期操作で応答本体を文字列として返す、GetStringAsyncメソッドにmyUriの値を指定して、返される結果XMLの文字列を変数resultXmlに格納します。
XElement.ParseメソッドでresultXmlを文字列として読み込みます。
AddressInfoクラス型の新しいリストである、myAddressInfoオブジェクトを作成します。
一度myAddressInfoオブジェクトをクリアしておきます。

Descendantsメソッドで全ての子孫要素

のコレクション内を変数resultで反復処理しながら、以下の処理を行います。
AddressInfoクラスのzipcodeプロパティに要素の値を、SubString関数を使って、000-1111とい形式に分割して指定します。
prefectureプロパティには要素の値を、cityプロパティには<city>要素の値を、townプロパティには<town>要素の値を指定して、AddメソッドでmyAddressInfoオブジェクトに追加していきます。<br /> resultListBoxのItemsSourceプロパティにmyAddressInfoオブジェクトを指定します。これで、郵便番号と、住所がListBoxに表示されます。</p> <pre class="brush: plain; " type="syntaxhighlighter"> Private Async Sub okButton_Click(sender As Object, e As RoutedEventArgs) Handles okButton.Click If WatermarkTextBox1.Text = String.Empty Then Exit Sub Else Dim myUri As String = String.Format("http://api.postalcode.jp/v1/zipsearch?word={0}&format=xml", WatermarkTextBox1.Text) Dim myHttpClient As New HttpClient Dim resultXml = Await myHttpClient.GetStringAsync(New Uri(myUri, UriKind.Absolute)) Dim xmldoc As XElement = XElement.Parse(resultXml) Dim myAddressInfo As New List(Of AddressInfo) myAddressInfo.Clear() For Each result In From c In xmldoc.Descendants("address") Select c With myAddressInfo .Add(New AddressInfo With { .zipcode = result.Element("zipcode").Value.Substring(0, 3) & "-" &result.Element("zipcode").Value.Substring(3, 4), .prefecture = result.Element("prefecture").Value, .city = result.Element("city").Value, .town = result.Element("town").Value}) End With Next ResultListBox.ItemsSource = myAddressInfo End If End Sub

表示された郵便番号と住所を選択した時の処理

Frameを表示状態にします。変数myAddressに、ListBoxから選択された項目をAddressInfoクラスに変換して、そのprefecture、city、townプロパティの値を取得して連結し格納します。
このmyAddressを引数にしてWebBrowserPageに遷移します。

  Private Sub ResultListBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ResultListBox.SelectionChanged
    Try
      myFrame.Visibility = Windows.UI.Xaml.Visibility.Visible
      Dim myAddress As String = DirectCast(ResultListBox.SelectedItem, AddressInfo).prefecture &DirectCast(ResultListBox.SelectedItem, AddressInfo).city &DirectCast(ResultListBox.SelectedItem, AddressInfo).town
      myFrame.Navigate(GetType(WebBrowserPage), myAddress)
    Catch
      myFrame.Visibility = Windows.UI.Xaml.Visibility.Collapsed
      Exit Sub
    End Try
  End Sub

戻る(←)アイコンがタップされた時の処理

Frameを非表示状態にします。

  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をダブルクリックしてリスト3のコードを記述します。

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

リスト3 (WebBrowserPage.xaml.vb)

Option Strict On

Public NotInheritable Class WebBrowserPage
  Inherits Page

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

MainPage.xamlから渡された値は、e.Parameterで受け取れます。これはObject型であるため、CStr関数で
String型にキャストします。変数myUriに

String.Format("http://www.bing.com/search?q={0}", Uri.EscapeDataString(myAddress))

と指定して、引数qにmyAddressの値をエスケープして指定します。
WebBrowserのSourceプロパティにmyUriで初期化されたUriを指定します。これで、WebBrowser内に住所に関連した情報が表示されます。

  Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    Dim myAddress As String = CStr(e.Parameter)
    Dim myUri = String.Format("http://www.bing.com/search?q={0}", Uri.EscapeDataString(myAddress))
    WebBrowser1.Source = New Uri(myUri, UriKind.Absolute)
  End Sub
End Class

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

このサンプルを元にしたアプリをWindows ストアで公開しています。
→ 新版:郵便番号検索(Windowsストア)

筆者からのお知らせ

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

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30