Обмен данными внутри приложения
Список ключевых терминов: обмен данными, класс App
Цель работы: освоить методику организации обмена данными в приложениях
Обмен данными в приложении
Приложения для Windows Phone, как и любые другие приложения, нуждаются во внутренних механизмах обмена данными. То есть, в простейшем виде, пользователь может ввести некоторые данные на странице №1, эти данные могут понадобиться на странице №2. При этом возможен как сценарий, когда со страницы №1 осуществляется прямой переход на страницу №2, а возможно, что "страница №1" - это страница настроек, данные, введенные на которой должны быть доступны всем остальным страницам. Более того, если расширить эту идею, обмен данными внутри приложения – это не только обмен информацией между страницами, и не только обмен информацией, которую вводит пользователь. Например, в приложении может быть описан некий объект, не имеющий визуального представления, но работающий с данными, которые должны поступать в него из других частей приложения. Приложение может, например, загружать некоторые данные из Интернета, или, скажем, получать ключ доступа к учетной записи пользователя после успешной авторизации в интернет-сервисе. Подобные данные или ключи могут никогда не выводиться в интерфейсе, но они могут быть нужны для обеспечения работоспособности различных механизмов.
Сейчас мы рассмотрим методики обмена данных внутри приложения, доработав приложение из проекта P4_1, разработкой которых мы занимались в Лабораторной работе №4. Переработаем приложение для реализации следующей функциональности:
- При переходе со страницы MainPage.xaml на страницу CommonPage.xaml на ней, в текстовом поле, выводится то имя пользователя, которое было введено на странице MainPage.xaml
- На станице CommonPage.xaml будет размещена фигура, фон которой закрашен цветом, задаваемым на странице Settings.xaml. Изменение цвета на странице настроек должно приводить к изменению цвета фигуры на странице, где размещена фигура
Передача параметров при вызове страницы и использование общедоступного поля класса App
Мы можем передать параметры вызываемой странице, подготовив, во-первых, саму эту страницу к приему параметров, во-вторых – передав эти параметры при её вызове. Мы реализовали эту функциональность при вызове страницы CommonPage.xaml со страницы MainPage.xaml. В Листинге 19.9.1 приведен код страницы MainPage.xaml.
using System; using System.Windows; using System.Windows.Navigation; using Microsoft.Phone.Controls; namespace P4_1 { public partial class MainPage : PhoneApplicationPage { // Конструктор public MainPage() { InitializeComponent(); } private void cmdEnter_Click(object sender, RoutedEventArgs e) { if (txtLogin.Text != "") { string destination = "/CommonPage.xaml" + String.Format("?User_name={0}", txtLogin.Text); NavigationService.Navigate(new Uri(destination, UriKind.Relative)); } else { MessageBox.Show("Нужно ввести учетные данные"); } } protected override void OnNavigatedFrom(NavigationEventArgs e) { NavigationService.RemoveBackEntry(); base.OnNavigatedFrom(e); } } }Листинг 19.1. Код страницы MainPage.xaml
В предыдущем примере, где мы использовали ту же страницу для демонстрации возможности отмены навигации, мы производили проверку заполнения в соответствующем событии. Теперь мы производим проверку на то, заполнено ли поле, еще до вызова команды навигации. Если поле не заполнено, мы выводим соответствующее сообщение. Если заполнено – формируем строку вызова страницы CommonPage.xaml и вызываем её. В начале строки, в которой мы передаём параметры, стоит знак "?", после чего следуют пары вида Имя_параметра=Значение_параметра. При передаче нескольких параметров эти пары разделяются знаком "&".
На страницу CommonPage.xaml добавлено текстовое поле для вывода строки, в которой использован текст, переданный ей со страницы MainPage.xaml. На этой же странице мы разместили прямоугольник, который собираемся закрашивать. Для хранения информации о цвете прямоугольника (точнее – о кисти, которой будем его закрашивать, хотя таким же образом, с соответствующими изменениями, можно было бы хранить и цвет, создавая потом на его основе кисть, и другие данные), мы используем общедоступное поле класса App, в Листинге 19.2 приведен фрагмент файла App.xaml.cs с описанием соответствующего поля. Обратите внимание на состав директив using – для работы с переменной типа SolidColorBrush нам понадобится пространство имен System.Windows.Media. Подобный подход позволяет организовывать универсальную систему обмена данными внутри приложения. В классе App можно размещать и общедоступные методы.
using System; using System.Diagnostics; using System.Windows; using System.Windows.Markup; using System.Windows.Navigation; using Microsoft.Phone.Controls; using Microsoft.Phone.Shell; using P4_1.Resources; using System.Windows.Media; namespace P4_1 { public partial class App : Application { /// <summary> /// Обеспечивает быстрый доступ к корневому кадру приложения телефона. /// </summary> /// <returns>Корневой кадр приложения телефона.</returns> public static PhoneApplicationFrame RootFrame { get; private set; } public SolidColorBrush MyBrush = new SolidColorBrush(Colors.Green); /// <summary> /// Конструктор объекта приложения. /// </summary> public App() {Листинг 19.2. Фрагмент кода App.xaml.cs