2010-03-23 11 views
5

Tengo una página en la que se navega Silverlight desde el MainPage.xaml, llamado OpenPage.xaml, entonces quiero pasar un valor nuevo a la MainPage.xaml - esto OpenPage.xaml se llaman por medio de esto:¿Pasa el valor de otra página a MainPage.xaml en Silverlight cuando usa Navigation?

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

de mainpage - esto no es un hijo de la MainPage que se sustituye el RootVisual - puedo llamar a esto:

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

para volver a la MainPage - sin embargo tengo que pasar un valor de OpenPage.xaml a MainPage.xaml: cómo acceder a la instancia de MainPage; tengo una propiedad llamada Document; sin embargo, cuando hago esto:

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

O esto:

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

consigo una excepción reparto no válido, porque creo que está tratando de emitir el OpenPage.xaml a MainPage.xaml - cómo consigo el NavigatedTo página, quiero para establecer la propiedad en MainPage.xaml desde OpenPage.xaml.
También deseo pasar valores de MainPage.xaml a otra página SavePage.xaml, pero esto tiene el mismo problema: ¿cómo puedo resolver esto?

Respuesta

6

utilizar un valor de cadena de consulta: -

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

MainPage entonces puede adquirir este valor utilizando: -

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

Editar:

En respuesta al comentario re pasar otros tipos .

Una vez que tenga lo anterior en su lugar, puede usar otros patrones de servicio para pasar otros tipos. Por ejemplo, consideremos un MessageService que implementa: -

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

A continuación, implementar esta interfaz y exponer la aplicación como dicen Singleton: -

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

Su OpenPage llama MessageService.Default.Store y coloca el Guid que resulta en la consulta cuerda.

MainPage luego prueba la presencia de dicho valor de cadena de consulta, si está presente utiliza su valor para llamar al MessageService.Default.Retrieve que elimina el elemento del servicio.

+0

Esta es una solución interesante - como ASP.NET cadenas de consulta, esto puede estar bien para mi ejemplo actual, pero es possble hacerlo con objetos ya que esto puede ser útil para la interacción de datos más complejas entre las páginas. Actualmente lo necesito para un nombre de archivo para el almacenamiento aislado, pero lo necesito para otros usos más adelante. Gracias. – RoguePlanetoid

+0

Como un lugar adicional y la mejor manera de leer el valor de QueryString que se ha pasado. – RoguePlanetoid

+0

@RoguePlanetoid: ¿Cómo es lo que pensé que ya he mostrado, dónde? Probablemente en OnNavigatedTo override sería lo mejor. – AnthonyWJones

0
Partial Public Class MainPage 
    Inherits UserControl 

    Public Sub New() 

     InitializeComponent() 

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

     ............... 
Cuestiones relacionadas