Обмен данными внутри приложения
Список ключевых терминов: обмен данными, класс 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