2012年5月14日月曜日

Windows Phone 別のページにデータを渡す方法まとめ

こんにちは, 今回はWindows Phone プログラミングのTips です。

Androidでもそうですが, Windows Phone でも 1画面, 1クラスです。  いや, 1画面, 1XAMLというべきか。

当然, ページクラスで使用したローカル変数は, 別のページへ遷移する時に, なくなってしまいます。

しかし, 別のページへ移動する場合に, そのページの処理結果もしくは, パラメータを別のページへ渡さなくてはなりません。


例)

リストのアイテムをクリックして, そのアイテムの情報を表示する(リストの情報(ID, 名前など)

ボタンを押したときに, そのページにある, textbox や, checkboxのデータを次のページで利用する


などです。こうした場合に, 何かしらの方法で渡す必要があります。

windows phone プログラミングでは, いくつかの方法がありますが, それを紹介します。


1.  query string でパラメータを渡す

2.   IsolatedStorageSettings 分離ストレージで, key, value を保存(key-valueストアのように)


3.   アプリケーションのローカルファイルにデータを保存しておく


4.   分離ストレージ(SQL Server CE にデータを保存する)


5.   メモリにデータをあげておく


詳細説明は次回以上のエントリーにまわして, ざっと説明します。


1. は, ページ移動の際に, NavigationService.Navigateを利用しますがに,

NavigationService.Navigate(new Uri("/Test.xaml?text=1&input=2", UriKind.Relative));

というような感じで, xaml ファイル名の後ろに, ?パラメータ=値 


というように, Web のクエリ文字列のように渡す方法です。 遷移したページの先でこのデータを取り出します。


ただ, この方法では, 文字列でしかデータを渡せません。


2. は, windows phone 固有の仕組みで, IsolatedStorageSettings 
というのがあります。

このクラスに,

IsolatedStorageSettings store = IsolatedStorageSettings.ApplicationSettings;

store["key"] = value;

という形で, key-value ストアのように利用できます。

key-valueストアは クラスなども保存できますし, プログラム終了後も残ります(おそらく, serialize されてどっかに書き込まれているのかと思われます)

したがって, 次のページへ移動しても, 他のどこのページへ行っても, データを取り出すことができます。

小さいデータ, たとえば, 設定などに向いています。


3.  は, アプリケーションのローカルにファイルを作成し, そこにデータを書き込む方法です。各アプリケーションには, 固有の領域があり他のアプリのデータには原則, アクセスできません。そこで, そこにファイルを作成し, データを書き込み,

後で 別のページでそのファイルを読み込み参照すればよいのです。


4. は, windows phone がもつ データベース SQL Server CE

にデータを入れる方法です。これも2,3,4 同様, どのページからでもアクセスできますし, アプリケーションを終了しても残ります。


public class DataContextEx : DataContext
    {
        private static string DATA_CONNECTION = "isostore:/ttt.sdf";

        public DataContextEx() : base(DATA_CONNECTION) {}
        public Table<TimerData> timerdata;
    }


このような感じで, ファイル名を各アプリで決められます。


5. これが意外に思いつかないし, 紹介されない方法ですが, 携帯系のプログラムなら, これだろ。

という方法です。 この方法であれば, 上記のいずれの方法よりも手軽に利用できます。


具体的な方法とは, 変数を static にするだけです。 クラス変数を入れることで, どこのクラス(ページ)からでもアクセスできます。(ただし, プログラムが終了するとなくなる)

また, 大きいobject などをこれにしたり, 多用すると, あっという間に out of memory

になるので, 多様しないように。めったに変更しないけど ,いろいろなところで参照したい変数とか, たいした大きさじゃないから, いいじゃんという場合に使用します。


では, 次回のエントリーから, その詳細について説明していきます。

0 件のコメント:

コメントを投稿