Как передать значения (параметры) между страницами XAML?
Подобные вопросы уже задавались ранее, но этот вопрос направлен на изучение большего количества вариантов и способности пропускать сложные объекты.
Вопрос в том, как передать параметры, но их действительно нужно разбить на три части.
- При переходе между страницами в приложении XAML как вы передаете параметры?
- В чем разница между использованием навигации Uri и ручной навигацией?
- Как можно передавать объекты (не только строки) при использовании навигации 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 }
}