11

Windows ストア アプリを Windows Phone 8 に変換する作業を行っています。WinRT の場合、frame.navigate を呼び出すときに任意のオブジェクトをパラメーターとして渡すことができます。(frame.navigate(type sourcePageType, object parameter))

Windows phone ではナビゲーションが異なるようです。次のように uri を呼び出してナビゲートします。

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

私が見つけていないページ間で複雑なオブジェクトを渡す方法はありますか?

4

9 に答える 9

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;
    }
}

次にNavigationService.Navigate("mypage.xaml", myParameter);、ソースページを呼び出し、ターゲットページのOnNavigatedToメソッドを呼び出しvar myParameter = NavigationService.GetLastNavigationData();て、パラメーターデータを取得します。

于 2012-12-23T06:00:27.097 に答える
3

上記のZikが提供する素晴らしい回答のVB.netバージョンを追加したいだけです。彼のコードを VB に変換する方法を理解すると、すぐにナビゲーションが WinRT/Windows 8 の方法と同様に機能するようになりました。

次のコードでモジュールを作成しました。

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

次に、次のような別のページに移動します。

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

最後に、別のページの OnNavigatedTo サブでそのオブジェクトを取得します。

ThisPageData = NavigationService.GetLastNavigationData()

Me.DataContext = ThisPageData

実際の回答は Zik の功績によるものです。

于 2013-03-28T10:43:10.790 に答える
2

MVVM アーキテクチャを使用している場合は、Messenger を使用して登録した後、文字列または任意の値を渡すことができます。文字列 (メッセージなど) 変数を使用してモデル クラス (PageMes​​sage など) を作成します。ホームページ.xaml から newpage.xaml に文字列を渡したい場合は、homepage.xaml で次のようなメッセージを送信するだけです

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

newpage.xaml で、次のようにメッセンジャーを登録する必要があります。

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

 private object ReceiveMessage(PageMessage action)
 {
    string receivedMessage=action.message;
    return null;
 }
于 2013-11-29T05:10:28.970 に答える
0

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

プロジェクトのシナリオについてもう少し詳しく教えていただければ、最善の道を決定するのに役立つ可能性があります。

于 2012-12-04T00:50:53.010 に答える
0

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

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

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

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

于 2012-12-03T04:55:14.523 に答える
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)); 
   } 
于 2013-10-15T21:11:18.560 に答える
0

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

于 2012-12-03T07:00:30.623 に答える
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");
    } 
于 2013-12-11T07:10:28.620 に答える
0

私がアプリで行ったことは、ある種の識別子 (インデックス、GUID など) を文字列として渡し、移動先のページの OnNavigatedTo() メソッドでオブジェクトを検索することです。したがって、オブジェクトは ViewModel (またはどこにでも) に保存されたままになり、文字列を渡すだけで済みます。

于 2012-11-30T23:07:10.440 に答える