1

データを渡しながら別の XAML ページに移動する文書化された方法は、データを URL パラメーターとしてシリアル化することによるようです。これは、単一のデータベース キーなどの単純なパラメーターに最適です。

NavigationService.Navigate(new Uri("/ViewContact.xaml?contactid=" + cid, UriKind.Relative));

ただし、検索クエリなど、かなり複雑なデータ構造を渡したい場合はどうすればよいでしょうか。このクエリには、キーワード、さまざまなフィルター、アイテムの配列などが含まれる場合があります。URL パラメーターを使用してこの種のデータを表現するのはかなり難しいでしょう。

質問: 重要なパラメーターを渡して、別のページに移動するための推奨される手法は何ですか?

1 つのアイデアは、最初に移動先のページの静的プロパティとしてデータまたはクエリを設定することです。

Query q = new Query();
// Set various parameters
ViewContact.SearchQuery = q;
NavigationService.Navigate(new Uri("/ViewContact.xaml?contactid=", UriKind.Relative));

次に、ViewContact が読み込まれると、その静的プロパティがチェックされ、データがメモリに読み込まれます。

このアプローチに何か問題がありますか、または推奨される別の方法はありますか?

4

3 に答える 3

2

Prism ディスカッション ボードのこのスレッドを見てください: Navigation using Object as parameter

最後に、NavigationUriから派生したクラスを使用したソリューションがありUriます。

public sealed class NavigationUri : Uri
{
  public NavigationUri(string uri)
    : base(uri, UriKind.Relative)
  {
    Parameters = new Dictionary<string, object>();
  }

  public Dictionary<string, object> Parameters
  {
    get;
    private set;
  }
}

(コンストラクタを公開しました)

その後、次のように使用できます。

var uri = new NavigationUri("/ViewContact.xaml");
uri.Parameters["SearchQuery"] = q;
NavigationService.Navigate(uri);

次に、OnNavigatedToあなたのメソッドでViewContact

public override void OnNavigatedTo(NavigationContext navigationContext)
{
  var uri = (NavigationUri)navigationContext.Uri;
  SearchQuery = (Query) uri.Parameters["SearchQuery"];
}

元のスレッドで提案されているように、クラスを使用してパラメーター キーをハードコーディングする代わりに生成することもできます。

public sealed class NavigationUriParameters
{
    public static readonly string SearchQuery = Guid.NewGuid().ToString();
}
于 2012-12-18T12:26:14.263 に答える
1

Silverlight用に開発していて、ディープリンクをサポートしたい場合は、URLがリンクに格納されているため、データをロードしてページをURLに表示するために必要なすべての情報を入力する必要があります。

他のすべての場合(ディープリンクのないSilverlightまたはWindows Phone)、アプリなどのグローバルに利用可能なオブジェクトの別の場所に情報(の一部)を保存できます。

前述のように、ページをロードするときにオブジェクトの識別子を渡してオブジェクトを取得できます(サービスまたはキャッシュから取得します)

現在のViewModel/DataをAppオブジェクトに保存し、それを新しいページにバインドすることもできます。

使用可能なリソースの量(時間、帯域幅、同時ユーザーなど)に応じて、これらのいずれかを選択するか、シナリオに応じてソリューションを切り替えることもできます。

于 2012-12-18T14:04:05.230 に答える
1

私のアプリでは、URL パラメータにある種の識別子を渡しました。

/FlightInfo.xaml?FlightID=4

OnNavigatedTo()次に、メソッドでそのフライト ID を調べます。フライトは、どこかに静的プロパティとして保持する ViewModel に保存されるため、似ていますが、この方法では URL が意味を持ち、戻る/再開がより適切に機能します。

于 2012-12-18T04:28:18.237 に答える