ピボットページを作成する(後編)

2011年7月29日(金)
PROJECT KySS

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

リスト5 個人情報の詳細データが表示される処理(PersonalInfoDetails.xaml.vb)

Option Strict On
Imports System.Xml.Linq
Partial Public Class PersonalInfoDetails
  Inherits PhoneApplicationPage
~コード略~

ReadXmldocクラスの新しいインスタンスmyReadXmldocオブジェクトをメンバ変数として宣言します。
  Dim myReadXmldoc As New ReadXmldoc

画面の遷移で移動した時に最初に呼ばれるイベント

ここで、MainPage.xamlの、ListBox2より選択された時点で渡された文字データを受け取ります。文字データはNavigationContextのQueryStringにDictionary として提供されます。送信時のキーワード(この場合Index)を基に渡された文字列情報を、myParam(“Index”)として取得します。
myParam(“Index”)の値を数値に変換して、変数Indexに格納します。
変数namaeに、ReadXmldocクラスのインスタンスmyReadXmldocでpersonalInfo関数を呼び出し、Descendantsメソッドで、変数Indexに該当する<情報>要素の子要素<氏名>の値を格納します。同様に、変数ageには<年齢>要素の値を、変数addressには<住所>要素の値を、変数companyには<勤務先>要素の値を格納します。
取得した値をTextBlock1のTextプロパティに改行(ChrW(10))を追加して指定します。
  Protected Overrides Sub OnNavigatedTo(ByVal e As System.Windows.Navigation.NavigationEventArgs)
    Dim myParam As IDictionary(Of String, String) = NavigationContext.QueryString
    Dim Index As Integer = Integer.Parse(myParam("personalInfoIndex"))
    Dim namae As String = myReadXmldoc.personalInfo.Descendants("情報")(Index).<氏名>.Value
    Dim age As String = myReadXmldoc.personalInfo.Descendants("情報")(Index).<年齢>.Value
    Dim address As String = myReadXmldoc.personalInfo.Descendants("情報")(Index).<住所>.Value
    Dim company As String = myReadXmldoc.personalInfo.Descendants("情報")(Index).<勤務先>.Value
 
    TextBlock1.Text = "【氏 名】" & namae & ChrW(10) & "【年 齢】" & age & ChrW(10) & "【住 所】" & address & ChrW(10) & "【勤務先】" & company
    MyBase.OnNavigatedTo(e)
  End Sub

[Topに戻る]ボタンがクリックされた時の処理

MainPage.xamlの1ページ目に遷移します。
  Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    NavigationService.Navigate(New Uri("/MainPage.xaml", UriKind.Relative))
  End Sub

エミュレーターの表示方向が変化するときに発生するイベント

エミュレーターが横向きになった時はTextBlockのWidthの値を広くとります。
  Private Sub PersonalInfoDetails_OrientationChanged(sender As Object, e As Microsoft.Phone.Controls.OrientationChangedEventArgs) Handles MyBase.OrientationChanged
    TextBlock1.Width = Me.ActualWidth
  End Sub

エミュレーターのBack(←)ボタンのイベントを上書きする処理

エミュレーターの持っている本来のBack処理を、e.Cancel=Trueで無効とします。
NavigationService.NavigateメソッドでMainPage.xamlに遷移します。引数にPivotIndex=1を渡していますので、MainPage.xamlの2ページ目に遷移します。
このBackボタンのイベントを上書きする処理を記述していないと、エミュレーターのBack(←)をクリックした際エラーが発生しますので、注意してください。
Protected Overrides Subと入力すると、インテリセンス機能が働き、イベントの一覧が表示されますので、その中から選択してください。
  Protected Overrides Sub OnBackKeyPress(ByVal e As System.ComponentModel.CancelEventArgs)
    e.Cancel = True
    NavigationService.Navigate(New Uri("/MainPage.xaml?PivotIndex=1", UriKind.Relative))
    MyBase.OnBackKeyPress(e)
  End Sub
End Class

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

リスト6 お気に入りのサイトがブラウザに表示される処理(myFavoriteSite.xaml.vb)

Option Strict On
Imports System.Xml.Linq
Partial Public Class myFavoritSite
  Inherits PhoneApplicationPage
~コード略~
ReadXmldocクラスの新しいインスタンスmyReadXmldocオブジェクトをメンバ変数として宣言します。
  Dim myReadXmldoc As New ReadXmldoc

[Topに戻る]ボタンがクリックされた時の処理

NavigationService.NavigateメソッドでMainPage.xamlの1ページ目に戻ります。
  Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    NavigationService.Navigate(New Uri("/MainPage.xaml", UriKind.Relative))
  End Sub

ページが読み込まれた時の処理

ここで、MainPage.xamlの、ListBox3より選択された時点で渡された文字データを受け取ります。文字データはNavigationContextのQueryStringにDictionary として提供されます。送信時のキーワード(この場合siteIndex)を基に渡された文字列情報を、myParam(“siteIndex”)として取得します。
myParam(“siteIndex”)の値を数値に変換して、変数Indexに格納します。
変数siteNameに、ReadXmldocクラスのインスタンスmyReadXmldocでfavoriteSite関数を呼び出し、Descendantsメソッドで、変数Indexに該当する<サイト名>要素の値を格納します。同様に、変数siteUriには<サイト名>要素の属性”uri”の値を格納します。
x:NameがPageTitleというTextBlockのTextプロパティにsiteName変数の値を指定します。サイト名が表示されます。
WebBrowser1.NavigateメソッドにsiteUriを絶対URIで指定します。ブラウザ内に、指定したサイトが表示されます。サイト名にPROJECT KySSを指定した場合は、TOPページは表示されますが、リンクをクリックするとSilverlight Installのアイコンが表示されます。Windows Phone 7.1で作成した場合も同様です。Installのアイコンをクリックしても、エラーとなってインストールはされません。WebBrowserコントロールは、執筆現時点では、Flash、Silverlightのページには対応していません。
  Private Sub myFavoritSite_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    Dim myParam As IDictionary(Of String, String) = NavigationContext.QueryString
    Dim Index As Integer = Integer.Parse(myParam("siteIndex"))
    Dim siteName As String = myReadXmldoc.favoriteSite.Descendants("サイト名")(Index).Value
    Dim siteUri As String = myReadXmldoc.favoriteSite.Descendants("サイト名")(Index).Attribute("uri").Value
    PageTitle.Text = siteName
    WebBrowser1.Navigate(New Uri(siteUri, UriKind.Absolute))
  End Sub

エミュレーターの表示方向が変化するときに発生するイベント

エミュレーターが横向きになった時はWebBrowserのWidthの値を広くとります。
  Private Sub myFavoritSite_OrientationChanged(sender As Object, e As Microsoft.Phone.Controls.OrientationChangedEventArgs) Handles MyBase.OrientationChanged
    WebBrowser1.Width = Me.ActualWidth
  End Sub

エミュレーターのBack(←)ボタンのイベントを上書きする処理

エミュレーターの持っている本来のBack処理を、e.Cancel=Trueで無効とします。
NavigationService.NavigateメソッドでMainPage.xamlに遷移します。引数にPivotIndex=2を渡していますので、MainPage.xamlの3ページ目に遷移します。
このBackボタンのイベントを上書きする処理を記述していないと、エミュレーターのBack(←)をクリックした際エラーが発生しますので、注意してください。
Protected Overrides Subと入力すると、インテリセンス機能が働き、イベントの一覧が表示されますので、その中から選択してください。
  Protected Overrides Sub OnBackKeyPress(ByVal e As System.ComponentModel.CancelEventArgs)
    e.Cancel = True
    NavigationService.Navigate(New Uri("/MainPage.xaml?PivotIndex=2", UriKind.Relative))
    MyBase.OnBackKeyPress(e)
  End Sub
End Class

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

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