web-dev-qa-db-ja.com

XAMLページ間で値(パラメーター)を渡す方法

以前にも同様の質問がされていましたが、この質問はより多くのオプションと複雑なオブジェクトを渡す機能を探求しようとしています。

問題はパラメータを渡す方法ですが、実際には3つの部分に分割する必要があります。

  1. XAMLアプリケーションでページ間を移動するとき、どのようにパラメーターを渡しますか?
  2. Uriナビゲーションと手動ナビゲーションの使用の違いは何ですか?
  3. Uriナビゲーションを使用するときに、オブジェクト(文字列だけでなく)を渡すにはどうすればよいですか?

Uriナビゲーションの例

page.NavigationService.Navigate(new Uri("/Views/Page.xaml", UriKind.Relative));

手動ナビゲーションの例

page.NavigationService.Navigate(new Page());

この質問に対する答えは、WP7、silverlight、WPF、およびWindows 8に適用されます。

注:SilverlightとWindows8には違いがあります

  • Windows Phone:Uriを使用してページに移動し、データをクエリ文字列またはインスタンスとして渡します
  • Windows 8 :タイプとパラメーターをオブジェクトとして渡すことでページに移動します
37
Daniel Little

パラメータを渡すメソッド

1。クエリ文字列の使用

クエリ文字列を介してパラメータを渡すことができます。このメソッドを使用すると、データを文字列に変換し、URLエンコードする必要があります。これは単純なデータを渡すためにのみ使用する必要があります。

ページの移動:

page.NavigationService.Navigate(new Uri("/Views/Page.xaml?parameter=test", UriKind.Relative));

宛先ページ:

string parameter = string.Empty;
if (NavigationContext.QueryString.TryGetValue("parameter", out parameter)) {
    this.label.Text = parameter;
}

2。 NavigationEventArgsの使用

ページの移動:

page.NavigationService.Navigate(new Uri("/Views/Page.xaml?parameter=test", UriKind.Relative));

// and ..

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    // NavigationEventArgs returns destination page
    Page destinationPage = e.Content as Page;
    if (destinationPage != null) {

        // Change property of destination page
        destinationPage.PublicProperty = "String or object..";
    }
}

宛先ページ:

// Just use the value of "PublicProperty"..

3。手動ナビゲーションの使用

ページの移動:

page.NavigationService.Navigate(new Page("passing a string to the constructor"));

宛先ページ:

public Page(string value) {
    // Use the value in the constructor...
}

Uriと手動ナビゲーションの違い

ここでの主な違いは、アプリケーションのライフサイクルだと思います。手動で作成されたページは、ナビゲーションのためにメモリに保存されます。詳細については こちら をご覧ください。

複雑なオブジェクトを渡す

メソッド1または2を使用して、複雑なオブジェクトを渡すことができます(推奨)。 Applicationクラスにカスタムプロパティを追加したり、Application.Current.Propertiesにデータを保存したりすることもできます。

86
Daniel Little