Передача строки между страницами в 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"];
Если вы используете архитектуру 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();
}