この間の続きで、ナビゲーションについてです。 (自分用のメモとしてまとめてみたのですが、図がないので分かりにくいです。)
ナビゲーションを使う方法は、この間まとめたサイトで解説されているのですが、ページ切り替え時にページ間でデータを受け渡す方法について、具体的に書いているサイトが見つからなかったため、そのあたりについてまとめてみます。
ページ間でデータを受け渡す場合の処理としては、以下の順になるかと思います。
・現在表示しているページの終了時に一時データを保存 ・新しいページの表示時に一時データを取得
一時データをどこに格納して受け渡すかが、問題になります。
■ 一時データの受け渡し方法 以下のサイトでは、Resourcesプロパティ、分離ストレージ、サーバとの通信による方法について、少し触れられていました。
[idocsq.net] 次の画面にデータを渡す方法 http://idocsq.net/page/152
上記の3つ以外では、ルートページのオブジェクト(一時データ)を直接参照しても、一応、データの受け渡しはできそうです。
■ 一時データを受け渡す/受け取るタイミング
データを受け渡すタイミングは、ページ非表示時の OnNavigatedFrom メソッドで行い、データを受け取るタイミングは、ページ表示前に呼ばれる OnNavigatedTo メソッドで行えば良いかと思います。
[MSDN] Page.OnNavigatedTo メソッド http://msdn.microsoft.com/ja-jp/library/dd502839(v=VS.95).aspx Page.OnNavigatedFrom メソッド http://msdn.microsoft.com/ja-jp/library/system.windows.controls.page.onnavigatedfrom(v=VS.95).aspx
■ 簡単な例
今回は、サーバへの保存はせず、Application リソース、MainPage のオブジェクトを利用する2種類の方法で、一時データの受け渡しをしたいと思います。
今回は、以下のクラスを一時データ用に使います。
■ 一時データ用の PageData クラス namespace SL_NavigationTest
{
class PageData
{
public string Message { get; set; }
}
...
}
■ Application リソースで宣言する場合 …①
■ 一時データ用の PageData クラス (キー名:TestDataR)
<Application xmlns=...略...
xmlns:local="clr-namespace:SL_NavigationTest">
<Application.Resources>
<local:PageData x:Key="TestDataR" Message="" />
</Application.Resources>
...略...
</Application>
■ コードで宣言する場合…②
■ 一時データ用の PageData クラス (変数名: TestDataC)
namespace SL_NavigationTest
{
public partial class MainPage : UserControl
{
public PageData TestDataC = new PageData();
public MainPage()
{
InitializeComponent();
}
}
}
■ ページ切り替え時の処理
■ ページの処理例
namespace SL_NavigationTest.Views
{
public partial class TestPage1 : Page
{
public TestPage()
{
InitializeComponent();
}
// ページ表示時の処理
// 一時データの取得&表示
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// リソースの場合 …①
var dataR = (App.Current.Resources["TestDataR"] as PageData);
// 一時データの表示処理を行う
msgTextBlockR.Text = "呼出し元:" + dataR.Message;
// コードの場合…②
var dataC = ((MainPage)App.Current.RootVisual).TestDataC;
// 一時データの表示処理を行う
msgTextBlockC.Text = "呼出し元:" + dataC.Message;
}
// ページ終了時の処理
// 一時データの保存
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
// リソースの場合…①
var dataR = (App.Current.Resources["TestDataR"] as PageData);
dataR.Message = msgTextBlockR.Text;
// コードの場合…②
var dataC = ((MainPage)App.Current.RootVisual).TestDataC;
dataC.Message = msgTextBlockC.Text;
}
}
}
|