2013-11-26 3 views
8

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

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

http://developer.nokia.com/Community/Wiki/Passing_parameters_while_navigating_between_pages_on_Windows_Phone – YK1

+0

@Erik, пожалуйста, не забудьте отметить, какой ответ лучше всего подходит для вас, поэтому будущие люди могут найти это полезным. –

ответ

19

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

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)); 

Для экранирования в:

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

i then get ArgumentNullException – Erik

+0

Я постараюсь запустить этот код как можно скорее - прямо сейчас мое приложение столкнулось с некоторым неправильным поведением, которое я должен исправить, чтобы он был стабильным, прежде чем снова проверить код ur – Erik

5

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

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

Мне нравится использовать PhoneApplicationService.State, который является Dictionary<String,Object>

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

Затем в второй странице вы это

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

MSDN Documentation

+0

Спасибо вам за ответы, i не может реализовать его только сейчас - мое приложение решило вести себя странно, но я постараюсь как можно скорее :) – Erik

+0

И я думаю, что этот метод лучше, если вы хотите, чтобы ваши данные были сохранены. – Romasz

+0

@Romasz Да, ты прав. Это очень простой способ сохранения данных. Это упрощает прохождение сложных пользовательских объектов между страницами xaml. Вместо того, чтобы сериализовать их или, что еще хуже, разбить их на формат строки и передать их по URL-адресу –

0

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

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

2

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

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

В newpage.xaml, и должны зарегистрировать мессенджер, как это,

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

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

Нравится программа? Поделись с друзьями!

2

Hy,

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

Смежные вопросы