2012-11-30 13 views
11

मैं विंडोज़ स्टोर ऐप को विंडोज फोन 8 में कनवर्ट करने पर काम कर रहा हूं। WinRT के लिए, आप frame.navigate को कॉल करते समय किसी ऑब्जेक्ट को पैरामीटर के रूप में पास कर सकते हैं। (frame.navigate (प्रकार SourcePageType, ऑब्जेक्ट पैरामीटर))मैं विंडोज फोन 8 में पृष्ठों के बीच गैर-स्ट्रिंग पैरामीटर कैसे पास करूं?

नेविगेशन विंडोज फोन के लिए अलग-अलग काम करता प्रतीत होता है, आप एक यूरी में कॉल करके नेविगेट करते हैं, जैसे: frame.navigate (new uri ("mypage.xaml", उरीकिंड .संबंधक))

विंडोज़ दस्तावेज नोट करता है कि आप इसे यूरी में जोड़कर पैरामीटर के रूप में एक स्ट्रिंग पास कर सकते हैं।

क्या उन पृष्ठों के बीच जटिल वस्तुओं को पारित करने का एक स्वीकार्य तरीका है जो मुझे अभी नहीं मिला है?

+2

आप एक नाम के साथ अलग भंडारण में सहेज सकते हैं और फिर आप उसे दूसरे पृष्ठ से वापस ले सकते हैं। –

+0

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

उत्तर

0

मैंने अपने ऐप्स में जो कुछ किया है वह एक स्ट्रिंग के रूप में कुछ प्रकार के पहचानकर्ता (इंडेक्स, GUID, जो कुछ भी) पास करता है, और उसके बाद उस पृष्ठ की OnNavigatedTo() विधि में ऑब्जेक्ट को देखें, जिसे आप नेविगेट करना चाहते हैं। तो ऑब्जेक्ट्स ViewModel (या कहीं भी) में संग्रहीत रहेंगे और आप बस एक स्ट्रिंग पास कर सकते हैं।

0

मैं दो व्यू मॉडलों के बीच एक सेवा एजेंट का उपयोग करने की सलाह दूंगा।

सबसे पहले, एक दृश्य मॉडल लोकेटर को परिभाषित करें। App.xaml में संसाधन शब्दकोश में इस वर्ग का उदाहरण बनाएं। प्रत्येक पृष्ठ के डेटाकेंटेक्स्ट को दृश्य मॉडल लोकेटर की संपत्ति पर सेट करें। उदाहरण के लिए John Papa's blog देखें।

दूसरा, GetAllItems() और GetItem (स्ट्रिंग आईडी) जैसी विधियों के साथ एक सेवा एजेंट बनाएं। दृश्य मॉडल लोकेटर में इस सेवा एजेंट का एक उदाहरण बनाएं। दोनों संदर्भ मॉडल में इस संदर्भ को पास करें।

तीसरा, डेटाकॉन्टेक्स्ट को दृश्य मॉडल प्रकार में कास्ट करके दूसरे दृश्य से दृश्य मॉडल तक पहुंचें। दृश्य मॉडल में नेविगेशन पैरामीटर पास करें ताकि वह GetItem को कॉल कर सके और इसकी गुणों को पॉप्युलेट कर सके।

0

एक नेविगेशन पैरामीटर भेजने का कोई तरीका नहीं है जो एक स्ट्रिंग नहीं है। मैं डेटा को ट्रांसफर करने के लिए आवश्यक डेटा को क्रमबद्ध करने के लिए आमतौर पर DataContractJsonSerializer का उपयोग करता हूं (लेकिन उरी लंबाई सीमाओं से सावधान रहें)। अपने querystring पैरामीटर में वर्णों से बचने के लिए Uri.EscapeDataString (पैरामीटर) का उपयोग करना भी याद रखें।

0

जैसा कि @ एग्रीस्टॉल ने कहा है, विंडोज फोन में सबसे अच्छी पद्धति एक पहचानकर्ता भेजना है और फिर अपने ऐप में डेटा का उपयोग करना है। व्यूमोडेल जो आप चाहते हैं उस वास्तविक डेटा तक पहुंचने के लिए। 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; 
    } 
} 

तो फिर तुम स्रोत पृष्ठ पर NavigationService.Navigate("mypage.xaml", myParameter); फोन चाहते हैं, और लक्ष्य पृष्ठ कॉल var myParameter = NavigationService.GetLastNavigationData(); की OnNavigatedTo विधि में पैरामीटर डेटा प्राप्त करने के।

3

मैं ऊपर ज़िक द्वारा प्रदान किए गए महान उत्तर का एक VB.net संस्करण जोड़ना चाहता हूं। एक बार जब मैंने यह पता लगाया कि वीबी में अपने कोड का अनुवाद कैसे किया जाए तो मैंने तुरंत 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 

और फिर इस तरह अन्य पृष्ठ पर नेविगेट:

मैं निम्नलिखित कोड के साथ एक मॉड्यूल बनाया ऑन नविगेटेड टू सब:

ThisPageData = NavigationService.GetLastNavigationData() 

Me.DataContext = ThisPageData 

वास्तविक उत्तर के लिए ज़िक को क्रेडिट करें।

0

एमएसडीएन पृष्ठों के बीच गैर-स्ट्रिंग पैरामीटर को पार करने के लिए 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.Default.Send(new PageMessage{message="Hello World"}); 

newpage.xaml में तरह संदेश भेजने 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"); 
    }