Передача строки между страницами в Windows Phone 8

Мне нужно передать простую строку между двумя страницами в Windows Phone 8. Я искал вокруг, пытаясь найти лучший способ сделать это - но те, которые я пробовал, оказались не работать, как они должны-поэтому я спрашиваю вас: каков наилучший способ передать простую строку между двумя страницами в Windows Phone 8. Это метод, который я использую для перехода на другую страницу:

NavigationService.Navigate(new Uri("/newpage.xaml", Urikind.Relative));

5 ответов


для строковой переменной проще всего использовать параметр строки запроса:

NavigationService.Navigate(new Uri("/newpage.xaml?key=value", Urikind.Relative));

возьмите его на целевой странице, используя NavigationContext.QueryString:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (NavigationContext.QueryString.ContainsKey("key"))
    {
         string val = NavigationContext.QueryString["key"];
         // etc ...
    }
}

Примечание: если ваша строка содержит только буквы и цифры, то выше будет работать без изменений. Но, если ваша строка может иметь URL-адрес-зарезервированные символы (например, &, ?), то вам придется URL-кодировать их. Используйте вспомогательные методы Uri.EscapeDataString и Uri.UnescapeDataString для этого.

бежать:

string encodedValue = Uri.EscapeDataString("R&R");
NavigationService.Navigate(new Uri("/newpage.xaml?key=" + encodedValue, Urikind.Relative));

unescape:

string encodedValue = NavigationContext.QueryString["key"];
string val = Uri.UnescapeDataString(encodedValue);

Я должен сказать, что для простых данных @McGarnagle, вероятно, является лучшим решением.

тем не менее, это также чрезвычайно быстрый и грязный способ сделать это. Этот метод также может принимать сложные объекты.

мне нравится использовать PhoneApplicationService.State что это Dictionary<String,Object>

PhoneApplicationService.State.add("KeyName",YourObject);

затем на второй странице вы делаете это

var yourObject = PhoneApplicationService.State["KeyName"];

документация MSDN


Если вы используете архитектуру MVVM, то вы можете передать строку после регистрации с помощью Messenger. Создайте класс модели(скажем, PageMessage) со строковой переменной (скажем, message). Вы хотите передать строку с домашней страницы.XAML для newpage.xaml, затем на главной странице.xaml просто отправить сообщение, как это

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

в newpage.xaml, u должен зарегистрировать messenger следующим образом,

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

 private object ReceiveMessage(PageMessage action)
 {
    string receivedMessage=action.message;
    return null;
 }

Как это вы можете передать что-нибудь даже навигации в архитектуре MVVM.


Hy,

другое решение и создать статический класс с одним или несколькими свойствами типа string в зависимости от того, что вам нужно, он улучшает способ, которым он доступен там, где вам нужно.


взгляните на Caliburn.микро. Он очень прост в настройке и позволяет передавать параметры через представления строго типизированным способом, например:

public void GotoPageTwo() {  
        navigationService.UriFor<PivotPageViewModel>()  
            .WithParam(x => x.NumberOfTabs, 5)  
            .Navigate();  
}

http://caliburnmicro.codeplex.com/wikipage?title=Working%20with%20Windows%20Phone%207%20v1.1&referringTitle=Documentation