Как передать значения (параметры) между страницами 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: страницы переходят на использование Uri и данные, переданные в виде строки запроса или экземпляра
  • Windows 8: страницы перемещаются путем передачи типа, а параметры как объекты

Ответ 1

Способы передачи параметров

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.