2012年7月25日水曜日

【Windows Metro プログラミング】ページ遷移で例外落ち(ヌルポ)

Windows Metro Styleのプログラミングを勉強していて
激しく躓いたところが一点あったので情報共有.
ちなみに環境はWindows8RPとVisualStudio Professional2012RC.
というかWPF勉強済みなら常識なのかもしれないけれど.
初めてのWPFなので勘弁して下さい.

今Metro Styleアプリの勉強で数少ない情報源である
Microsoft公式のデベロッパーセンター
そこのサンプルで勉強をしていたのだけど,
パート3 ブログリーダーを作成する
http://msdn.microsoft.com/ja-jp/library/windows/apps/br211380.aspx
ここで躓いた.

具体的には
ページとナビゲーションの追加
にあるページ遷移なんだけど,
ページ遷移は

this.Frame.Navigate(typeof(SplitPage), e.ClickedItem);
でできるそうな.
ふむふむなーる
と思いながらタイピング,言われたとおりに実行を行い,
ページ遷移させようとすると
LayoutAwarePage.csという自動生成コードにある
onNavigatedFromメソッド中の
frameState[_pageKey] = pageState; ここから
ArgumentNullExceptionという例外が帰ってくる.
どうやら配列のキー_pageKeyがnullらしい.
どこがおかしいのかとそのページをさんざっぱら読みまくっても答えは落ちてなかった.
ググってみるとMSDNのフォーラムで同様の質問があった.
http://social.msdn.microsoft.com/Forums/en/winappswithcsharp/thread/a2611a92-4d2e-4186-9118-cde94346c756
なんかCP版まではうまく動いてたのにRP版でページ切り替えができなくなったとか書いてある.

解決法
遷移元のページ(このサンプルだとItemsPage.xaml.cs)
のOnNavigatedToメソッドの一番最初に
base.OnNavigatedTo (e);
を追加してやる.それだけ.
明示的にスーパークラスのメソッドを呼び出さないといけないようだ.
デベロッパーセンターに書いてないぞ…
どうやらスーパークラスであるLayoutAwarePage.csに遷移元を教えておかないと遷移行為自体ができないようになってるらしい.

つまり
ItemsPage.xaml.cs の OnNavigatedToメソッドはこうなる

        protected override async void OnNavigatedTo (NavigationEventArgs e) {
            base.OnNavigatedTo (e);
            FeedDataSource feedDataSource = (FeedDataSource)App.Current.Resources["feedDataSource"];
            if (feedDataSource != null) {
                if (feedDataSource.Feeds.Count == 0) {
                    await feedDataSource.GetFeedsAsync ();
                }
                this.DefaultViewModel["Items"] = feedDataSource.Feeds;
            }
        }

これでItemView_ItemClickメソッドで呼び出している
SplitPageへ遷移することができるようになった.
遷移で失敗しているからこのItemView_ItemClickメソッドに何かが足りないのかと思っていた…

レイアウト済みページを追加した場合に起こりうるので注意.

どうでもいいけどC#のスーパークラス呼び出しってbaseなんだね.
superじゃないんだ.Javaに毒されすぎかな.

1 件のコメント:

  1. 情報ありがとうございます!
    Windowsストアアプリのサスペンド処理で同様な事が発生してます。

    返信削除