2010-03-23 5 views
5

Ich habe eine Seite in Silverlight, die aus dem MainPage.xaml navigiert wird, genannt OpenPage.xaml, ich will dann an den MainPage.xaml Wert überschreiten zurück - das OpenPage.xaml diese aufgerufen wird:Übergeben Sie den Wert von einer anderen Seite in Silverlight an MainPage.xaml, wenn Sie Navigation verwenden?

NavigationService.Navigate(new Uri("/OpenPage.xaml", UriKind.Relative)); 

von der Startseite - das ist nicht ein Kind der main~~POS=TRUNC als die RootVisual ersetzt wird - ich das nennen kann:

NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); 

zur Hauptseite zurückzukehren - allerdings muss ich auf einen Wert von OpenPage.xaml passieren die MainPage.xaml - wie ich auf die MainPage-Instanz zugreifen kann - ich habe eine Eigenschaft namens Document jedoch, wenn ich dies tue:

 MainPage m = (MainPage)Application.Current.RootVisual; 
     m.Document = "Hello World"; 

Oder diese:

((MainPage)root).Document = "Hello World"; 

ich eine ungültige Guss Ausnahme, weil ich denke, es wird versucht, die OpenPage.xaml zu MainPage.xaml zu werfen - wie ich die NavigatedTo Seite, ich will um die Eigenschaft auf MainPage.xaml von OpenPage.xaml festzulegen.
Ich möchte auch Werte aus der MainPage.xaml auf eine andere Seite SavePage.xaml übergeben - aber das hat das gleiche Problem - wie kann ich das beheben?

Antwort

6

einen Query-String-Wert verwenden: -

NavigationService.Navigate(new Uri("/MainPage.xaml?value=Hello%20World", UriKind.Relative); 

MainPage kann dann diesen Wert erwerben mit: -

string value = this.NavigationContext.QueryString["value"]; 

bearbeiten:

Als Reaktion Wieder vorbei anderen Kommentar .

Sobald Sie den obigen Inplace haben, können Sie andere Dienstmuster verwenden, um andere Typen zu übergeben. Zum Beispiel eine MessageService betrachten, die implementiert: -

interface IMessageService 
{ 
    Guid Store(object value) 
    object Retrieve(Guid key) 
} 

Sie würden dann diese Schnittstelle implementieren und die Umsetzung freizulegen, wie Singleton sagen: -

public class MessageService : IMessageService 
{ 
    public static IMessageService Default { // singleton stuff here } 
} 

Ihr Open ruft MessageService.Default.Store und legt die resultierende Guid in der Abfrage Zeichenfolge.

Die MainPage testet dann auf das Vorhandensein eines solchen Abfrage-String-Werts, wenn vorhanden verwendet seinen Wert zum Aufruf MessageService.Default.Retrieve, die das Element aus dem Dienst entfernt.

+0

Dies ist eine interessante Lösung - wie ASP.NET Querystrings, das für ein aktuelles Beispiel in Ordnung sein, aber ist es possble es mit Objekten zu tun, wie dies für komplexere Daten Interaktion zwischen den Seiten nützlich sein können. Momentan brauche ich es für einen Dateinamen für isolierten Speicher, aber ich brauche es später für andere Zwecke. Vielen Dank. – RoguePlanetoid

+0

Als zusätzliche, wo und wie der QueryString-Wert, der übergeben wurde am besten zu lesen. – RoguePlanetoid

+0

@ RoguePlanetoid: Wie ist, was ich dachte, ich habe bereits gezeigt, wo? Wahrscheinlich in der OnNavigatedTo Override wäre das Beste. – AnthonyWJones

0
Partial Public Class MainPage 
    Inherits UserControl 

    Public Sub New() 

     InitializeComponent() 

     ContentFrame.Source = New Uri("/About", UriKind.Relative) 

     ............... 
Verwandte Themen