Как передать значения (параметры) между страницами XAML?

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

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

  1. При переходе между страницами в приложении XAML как вы передаете параметры?
  2. В чем разница между использованием навигации Uri и ручной навигацией?
  3. Как можно передавать объекты (не только строки) при использовании навигации Uri?

Пример Uri навигации

page.NavigationService.Navigate(new Uri("/Views/Page.xaml", UriKind.Relative));

Пример ручной навигации

page.NavigationService.Navigate(new Page());

Ответ на этот вопрос относится к WP7, silverlight, WPF и Windows 8.

Примечание. Существует разница между Silverlight и Windows8.

  • Windows Phone: страницы перемещаются с использованием Uri, а данные передаются в виде строки запроса или экземпляра.
  • Windows 8: к страницам переходят, передавая тип и параметры как объекты

2 ответа

Решение

Методы для передачи параметров

1. Использование строки запроса

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

Навигационная страница:

page.NavigationService.Navigate(new Uri("/Views/Page.xaml?parameter=test", UriKind.Relative));

Целевая страница:

string parameter = string.Empty;
if (NavigationContext.QueryString.TryGetValue("parameter", out parameter)) {
    this.label.Text = parameter;
}

2. Использование NavigationEventArgs

Навигационная страница:

page.NavigationService.Navigate(new Uri("/Views/Page.xaml?parameter=test", UriKind.Relative));

// and ..

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    // NavigationEventArgs returns destination page
    Page destinationPage = e.Content as Page;
    if (destinationPage != null) {

        // Change property of destination page
        destinationPage.PublicProperty = "String or object..";
    }
}

Целевая страница:

// Just use the value of "PublicProperty"..

3. Использование ручной навигации

Навигационная страница:

page.NavigationService.Navigate(new Page("passing a string to the constructor"));

Целевая страница:

public Page(string value) {
    // Use the value in the constructor...
}

Разница между Uri и ручной навигацией

Я думаю, что основным отличием здесь является жизненный цикл приложения. Страницы, созданные вручную, хранятся в памяти по причинам навигации. Подробнее об этом читайте здесь.

Прохождение сложных объектов

Вы можете использовать метод один или два для передачи сложных объектов (рекомендуется). Вы также можете добавить пользовательские свойства в Application Класс или хранить данные в Application.Current.Properties,

Для тех, у кого все еще есть проблемы, потому что у них нет функции onNavigatedTo для переопределения и использования фрейма для навигации, это то, что я использовал.

На странице, с которой вы переходите: скажем, эта страница называется «StartPoint.xaml».

      NameOfFrame.Navigate(new System.Uri("Destination.xaml", UriKind.RelativeOrAbsolute), ValueToBePassed);

  • В моем случае ValueToBePassed была простой строкой, которую я не пробовал с объектом. (под простой строкой я подразумеваю string code = "hello world";)

На странице Destination.xaml: создайте событие загрузки страницы.

  • Это можно сделать, перейдя в окно свойств страницы > события > загружено > дважды щелкните поле рядом с загруженным, чтобы автоматически сгенерировать функцию и перейти к ней в коде программной части.

Destinations.xaml > загрузить

      private string x;

private void Page_Loaded(object sender, RoutedEventArgs e)
{
   x = StartPoint.ValueToBePassed;
   //Call functions or do other stuff while im here
   //e.g. if (x != "") { please work you damn code }
   //     else { go to sleep and forget about the worries }
}
Другие вопросы по тегам