2012-11-30 2 views
11

私はWindowsストアアプリケーションをWindows Phone 8に変換しています.WinRTでは、frame.navigateを呼び出すときに、任意のオブジェクトをパラメータとして渡すことができます。 (frame.navigate(type sourcePageType、object parameter))Windows Phone 8のページ間で文字列以外のパラメータを渡すにはどうすればよいですか?

ナビゲーションはWindowsの電話機とは違うようですが、あなたはuriを呼び出してナビゲートします:frame.navigate(new uri( "mypage.xaml"、UriKind .relative))

Windowsのドキュメントでは、文字列をパラメータとしてuriに追加することで渡すことができます。

見つからないページ間に複雑なオブジェクトを渡す方法はありますか?

+2

名前を付けて独立したストレージに保存してから、別のページから戻すことができます。 –

+0

http://stackoverflow.com/questions/12444816/how-to-pass-values-parameters-between-xaml-pages/12444817#12444817 –

答えて

0

私のアプリでやったことは、ある種の識別子(インデックス、GUIDなど)を文字列として渡してから、ナビゲートしたいページのOnNavigatedTo()メソッドでオブジェクトを検索します。したがって、オブジェクトはViewModel(またはどこにでも)に格納されたままになり、文字列を渡すことができます。

0

2つのビューモデル間でサービスエージェントを使用することをおすすめします。

まず、ビューモデルロケータを定義します。 app.xamlのリソースディクショナリにこのクラスのインスタンスを作成します。各ページのDataContextをビューモデルロケータのプロパティに設定します。例については、John Papa's blogを参照してください。

次に、GetAllItems()およびGetItem(string id)などのメソッドを使用してサービスエージェントを作成します。ビューモデルロケータでこのサービスエージェントのインスタンスを作成します。この参照を両方のビューモデルに渡します。

第3に、ビューモデルタイプにDataContextをキャストすることによって、2番目のビューからビューモデルにアクセスします。ナビゲーションパラメータをビューモデルに渡し、GetItemを呼び出してそのプロパティを設定できるようにします。

0

文字列ではないナビゲーションパラメータを送信する方法はありません。私は通常、DataContractJsonSerializerを使用して転送する必要のあるデータをシリアル化します(ただし、Uriの長さの制限に注意してください)。 また、Uri.EscapeDataString(パラメータ)を使用して、querystringパラメータの文字をエスケープすることを忘れないでください。

0

@repstollが述べたように、Windows Phoneの最善の方法は、識別子を送信してApp.ViewModelのデータを利用して、必要な実際のデータにアクセスすることです。 QueryStringの長さには制限があります。ほとんどの場合、これを制限することは実際には望ましくありません。

プロジェクトのシナリオについてもう少し詳しく知ることができたら、最適なパスを判断するのに役立ちます。

+4

これはコメントとしては良いでしょう –

15

そうように私は、のNavigationServiceクラスを拡張することになった:

public static class NavigationExtensions 
{ 
    private static object _navigationData = null; 

    public static void Navigate(this NavigationService service, string page, object data) 
    { 
     _navigationData = data; 
     service.Navigate(new Uri(page, UriKind.Relative)); 
    } 

    public static object GetLastNavigationData(this NavigationService service) 
    { 
     object data = _navigationData; 
     _navigationData = null; 
     return data; 
    } 
} 

その後、あなたはパラメータデータを取得するためにソースページ上、及びターゲットページコールvar myParameter = NavigationService.GetLastNavigationData();のOnNavigatedTo方法でNavigationService.Navigate("mypage.xaml", myParameter);を呼びたいです。

3

上記のZikによって提供された素晴らしい答えのVB.netバージョンを追加したいだけです。彼のコードをVBに翻訳する方法を理解したら、すぐにWinRT/Windows 8の方法と同じようにナビゲーションができました。

私は次のコードでモジュールを作成しました:で、私の他のページでは、そのオブジェクトを取得するには、

NavigationService.Navigate("pagename.xaml", ObjectToPassToThePage) 

そして最後に:その後、

Module NavigationExtensionsModule 

Sub New() 
End Sub 
Private _navigationData As Object = Nothing 

<System.Runtime.CompilerServices.Extension> _ 
Public Sub Navigate(service As NavigationService, page As String, data As Object) 
    _navigationData = data 
    service.Navigate(New Uri(page, UriKind.Relative)) 
End Sub 

<System.Runtime.CompilerServices.Extension> _ 
Public Function GetLastNavigationData(service As NavigationService) As Object 
    Dim data As Object = _navigationData 
    _navigationData = Nothing 
    Return data 
End Function 
End Module 

そして、このように別のページに移動しますOnNavigatedToサブ:

ThisPageData = NavigationService.GetLastNavigationData() 

Me.DataContext = ThisPageData 

実際の答えはZikになります。

0

MSDNの概要3文字列以外のパラメータをページ間で渡す方法。カスタムナビゲーション拡張、静的プロパティ、JSON +分離ストレージなどがあります。コードはMicrosoftから撮影:

/// <summary> 
    /// Custom Navigation Extensions. 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void btnMethod1_Click(object sender, RoutedEventArgs e) 
    { 
     NavigationService.Navigate("/Result.xaml?name=1", listString); 
    } 


    /// <summary> 
    /// Static properties 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void btnMethod2_Click(object sender, RoutedEventArgs e) 
    { 
     App.ObjectNavigationData = listString; 
     NavigationService.Navigate(new Uri("/Result.xaml?name=2", UriKind.Relative)); 
    } 


    /// <summary> 
    /// Json + IsolatedStorage 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void btnMethod3_Click(object sender, RoutedEventArgs e) 
    { 
     string filePath = "objectData"; 


     using (IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
     { 
      if (isolatedStorage.FileExists(filePath)) 
      { 
       isolatedStorage.DeleteFile(filePath); 
      } 


      using (IsolatedStorageFileStream fileStream = isolatedStorage.OpenFile(filePath, FileMode.Create, FileAccess.Write)) 
      { 
       string writeDate = string.Empty; 


       // Json serialization. 
       using (MemoryStream ms = new MemoryStream()) 
       { 
        var ser = new DataContractJsonSerializer(typeof(List<string>)); 
        ser.WriteObject(ms, listString); 
        ms.Seek(0, SeekOrigin.Begin); 
        var reader = new StreamReader(ms); 
        writeDate = reader.ReadToEnd(); 
       } 


       // Save to IsolatedStorage. 
       using (StreamWriter writer = new StreamWriter(fileStream)) 
       { 
        writer.WriteLine(writeDate); 
       } 
      } 
     } 


     NavigationService.Navigate(new Uri("/Result.xaml?name=3", UriKind.Relative)); 
    } 
2

あなたはMVVMアーキテクチャを使用している場合は、文字列またはMessengerを使用して登録した後、任意の値を渡すことができます。文字列(メッセージ)変数を持つモデルクラス(例:PageMes​​sage)を作成します。あなたは、あなたがこのようなメッセンジャーに登録する必要があり、ちょうどnewpage.xamlでこの

Messenger.Default.Send(new PageMessage{message="Hello World"}); 

のようなメッセージを送るhomepage.xamlで、その後、newpage.xamlするhomepage.xamlから文字列を渡したい

Messenger.Default.Register<PageMessage>(this, (action) => ReceiveMessage(action)); 

private object ReceiveMessage(PageMessage action) 
{ 
    string receivedMessage=action.message; 
    return null; 
} 
0
Yes there is a way to use a complex object in different pages in wp8 or wp7. You can use complex objects between pages by IsolatedStorageSettings. 

IsolatedStorageSettings AppSettings = IsolatedStorageSettings.ApplicationSettings; 

// to save an object in isolatedstoragesettings 
if (!AppSettings.Contains("ObjectKey")) 
     AppSettings.Add("ObjectKey", Your object value); 
else 
     AppSettings["ObjectKey"] = Your object value; 

// to retrieve value of an object from isolatedstoragesettings 
if(AppSettings.Contains("ObjectKey")) 
    { 
    var objectValue = (Cast object to type)AppSettings["ObjectKey"]; 
    //Remove 
    AppSettings.Remove("ObjectKey"); 
    } 
関連する問題