Список ключевых терминов: обмен данными, класс App
Цель работы: освоить методику организации обмена данными в приложениях
Приложения для Windows Phone, как и любые другие приложения, нуждаются во внутренних механизмах обмена данными. То есть, в простейшем виде, пользователь может ввести некоторые данные на странице №1, эти данные могут понадобиться на странице №2. При этом возможен как сценарий, когда со страницы №1 осуществляется прямой переход на страницу №2, а возможно, что "страница №1" - это страница настроек, данные, введенные на которой должны быть доступны всем остальным страницам. Более того, если расширить эту идею, обмен данными внутри приложения – это не только обмен информацией между страницами, и не только обмен информацией, которую вводит пользователь. Например, в приложении может быть описан некий объект, не имеющий визуального представления, но работающий с данными, которые должны поступать в него из других частей приложения. Приложение может, например, загружать некоторые данные из Интернета, или, скажем, получать ключ доступа к учетной записи пользователя после успешной авторизации в интернет-сервисе. Подобные данные или ключи могут никогда не выводиться в интерфейсе, но они могут быть нужны для обеспечения работоспособности различных механизмов.
Сейчас мы рассмотрим методики обмена данных внутри приложения, доработав приложение из проекта P4_1, разработкой которых мы занимались в Лабораторной работе №4. Переработаем приложение для реализации следующей функциональности:
Мы можем передать параметры вызываемой странице, подготовив, во-первых, саму эту страницу к приему параметров, во-вторых – передав эти параметры при её вызове. Мы реализовали эту функциональность при вызове страницы 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);
}
}
}
В предыдущем примере, где мы использовали ту же страницу для демонстрации возможности отмены навигации, мы производили проверку заполнения в соответствующем событии. Теперь мы производим проверку на то, заполнено ли поле, еще до вызова команды навигации. Если поле не заполнено, мы выводим соответствующее сообщение. Если заполнено – формируем строку вызова страницы 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()
{
При создании объекта MyBrush мы инициализировали его цветом Green из системного перечисления Colors, то есть, по умолчанию цвет кисти будет зеленым.
В Листинге 19.3 приведен код страницы CommonPage.xaml (рис. 9.1.), здесь нас интересуют прямоугольник и текстовое поле.
(рис 19.1) Обновленный внешний вид страницы CommonPage.xaml
<phone:PhoneApplicationPage
x:Class="P4_1.CommonPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True">
<!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel содержит имя приложения и заголовок страницы-->
<StackPanel Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="НАВИГАЦИЯ" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock Text="страница" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel – поместите здесь дополнительное содержимое-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBlock x:Name="txtUserName" HorizontalAlignment="Left" Margin="10,10,0,0"
TextWrapping="Wrap" VerticalAlignment="Top"
Height="50" Width="446"/>
<Rectangle x:Name="rectColor" HorizontalAlignment="Left"
Height="111" Margin="141,156,0,0" Stroke="Black"
VerticalAlignment="Top" Width="183" Fill="#FFF4F4F5"/>
</Grid>
</Grid>
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True" Mode="Minimized">
<shell:ApplicationBarIconButton IconUri="/Images/questionmark.png"
Text="О программе" Click="ApplicationBarIconButton_Click"/>
<shell:ApplicationBar.MenuItems>
<shell:ApplicationBarMenuItem Text="Настройки" Click="ApplicationBarMenuItem_Click"/>
<shell:ApplicationBarMenuItem Text="Команда меню"/>
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
</phone:PhoneApplicationPage>
Для разбора параметров, которые переданы странице при вызове её со страницы MainPage.xaml мы применяем обработчик события OnNavigatedTo. Там же мы получаем значение общего поля MyBrush из класса App и применяем его к прямоугольнику (Листинг 10.4).
using System;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using System.Collections.Generic;
using Microsoft.Phone.Shell;
namespace P4_1
{
public partial class CommonPage : PhoneApplicationPage
{
public CommonPage()
{
InitializeComponent();
}
private void ApplicationBarMenuItem_Click(object sender, EventArgs e)
{
NavigationService.Navigate(new Uri("/Pages/Settings.xaml", UriKind.Relative));
}
private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
NavigationService.Navigate(new Uri("/About.xaml", UriKind.Relative));
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
IDictionary<string, string> parameters = this.NavigationContext.QueryString;
if (parameters.ContainsKey("User_name"))
{
txtUserName.Text = "Здравствуйте, "+parameters["User_name"];
}
rectColor.Fill = (Application.Current as App).MyBrush;
base.OnNavigatedTo(e);
}
}
}
Для работы со словарем (объект типа IDictionary) мы, в обработчике события OnNavigatedTo подключили пространство имен System.Collections.Generic. В словаре оказываются параметры, переданные странице при вызове. Далее мы проверяем, имеется ли в словаре ключ "User_name" (регистр символов имеет значение), если имеется – записываем в поле txtUserName текст приветствия с именем пользователя, обратившись к соответствующему элементу словаря по ключу.
Далее, в том же обработчике, мы назначаем свойству Fill прямоугольника rectColor кисть, которая определена в классе App.
На странице Settings.xaml, рис. 9.2, (Листинг 19.5), мы разместили элемент управления ColorPicker с именем cpMy (его можно найти в пакете элементов управления Coding4Fun, в одной из предыдущих работ мы рассматривали использование пакетов элементов управления сторонних разработчиков).
(рис 19.2) Обновленный внешний вид страницы Settings.xaml
<phone:PhoneApplicationPage
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Controls="clr-namespace:Coding4Fun.Toolkit.Controls;assembly=Coding4Fun.Toolkit.Controls"
x:Class="P4_1.Pages.Settings"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<!--Элемент управления Pivot-->
<phone:Pivot Title="НАВИГАЦИЯ">
<!--Первый элемент Pivot-->
<phone:PivotItem Header="цвет">
<Controls:ColorPicker x:Name="cpMy" HorizontalAlignment="Left" Height="603" VerticalAlignment="Top" Width="456" />
</phone:PivotItem>
<!--Второй элемент Pivot-->
<phone:PivotItem Header="размер">
<Grid/>
</phone:PivotItem>
<!--Третий элемент Pivot-->
<phone:PivotItem Header="общие">
<Button x:Name="cmdLogOut" Content="Выйти из системы" HorizontalAlignment="Left"
Height="83" Margin="52,84,0,0" VerticalAlignment="Top"
Width="259" Click="cmdLogOut_Click"/>
</phone:PivotItem>
</phone:Pivot>
</Grid>
</phone:PhoneApplicationPage>
В Листинге 19.6 вы можете видеть код страницы Settings.xaml.cs.
using System;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using System.Windows.Media;
namespace P4_1.Pages
{
public partial class Settings : PhoneApplicationPage
{
public Settings()
{
InitializeComponent();
}
private void cmdLogOut_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
if (NavigationService.CurrentSource == new Uri("/MainPage.xaml", UriKind.Relative))
{
while (NavigationService.CanGoBack)
{
NavigationService.RemoveBackEntry();
}
(Application.Current as App).MyBrush.Color = Colors.Green;
}
base.OnNavigatedFrom(e);
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
cpMy.Color = (Application.Current as App).MyBrush.Color;
base.OnNavigatedTo(e);
}
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
(Application.Current as App).MyBrush.Color = cpMy.Color;
base.OnBackKeyPress(e);
}
}
}
Здесь, при переходе на страницу мы устанавливаем свойство Color элемента управления cpMy в то значение цвета, которое хранится в кисти MyBrush, определенной в классе App. Это позволяет пользователю видеть, какой именно цвет является текущим.
Когда пользователь работает с элементом управления cpMy, мы не вызываем никаких событий, записывая выбранный в элементе управления цвет при обработке события OnBackKeyPress. В данном случае выбор пал именно на это событие лишь для того, чтобы привести пример его использования. Здесь, кроме того, можно отменить переход по кнопке Назад (хотя без наличия веских причин делать этого не следует). Для того, чтобы не замедлять навигацию по кнопке Назад, в этом событии не следует размещать код, выполнение которого способно занять некоторое время. Обновить значение цвета в общедоступной кисти мы можем и в ходе выбора этого цвета, реагируя на соответствующее событие элемента cpMy, и в обработчике события OnNavigatedFrom. В этот обработчик, в сравнении с предыдущим вариантом учебного приложения, внесено изменение, которое позволяет уточнить ситуацию очистки стека переходов. Мы проверяем, осуществляется ли переход на страницу MainPage.xaml, и если это так – очищаем стек и сбрасываем к значению по умолчанию цвет кисти. Если в сценарии, подобном нашему, не уделить внимание очистке подобного поля (или иной его обработке), окажется, что если пользователь вошёл в приложение под одной учетной записью, поработал с ним, вышел, и вошёл снова под другой учетной записью, ему могут быть доступны данные, которые введены в первом сеансе работы.
Мы рассмотрели механизмы, которые можно использовать при передаче данных внутри приложения. Один из них подходит для передачи параметров страницам при их вызове, и подразумевает построение строки параметров вызывающей страницей и обработку этих параметров вызываемой страницей. Второй подход более универсален, он подразумевает описание общедоступного поля в классе App и использование этого поля в приложении.
Продумайте систему обмена данными между страницами приложения, над котором вы работаете. Подумайте, где достаточно будет передачи данных с использованием параметров, передаваемых странице при её вызове, а где понадобится использовать общедоступное поле, объявленное в классе App. В учебных целях реализуйте оба механизма.
К данной лекции подготовлено видеоприложение и демонстрационный программный проект.
Список ключевых терминов: обмен данными, класс App
Цель работы: освоить методику организации обмена данными в приложениях
Приложения для Windows Phone, как и любые другие приложения, нуждаются во внутренних механизмах обмена данными. То есть, в простейшем виде, пользователь может ввести некоторые данные на странице №1, эти данные могут понадобиться на странице №2. При этом возможен как сценарий, когда со страницы №1 осуществляется прямой переход на страницу №2, а возможно, что "страница №1" - это страница настроек, данные, введенные на которой должны быть доступны всем остальным страницам. Более того, если расширить эту идею, обмен данными внутри приложения – это не только обмен информацией между страницами, и не только обмен информацией, которую вводит пользователь. Например, в приложении может быть описан некий объект, не имеющий визуального представления, но работающий с данными, которые должны поступать в него из других частей приложения. Приложение может, например, загружать некоторые данные из Интернета, или, скажем, получать ключ доступа к учетной записи пользователя после успешной авторизации в интернет-сервисе. Подобные данные или ключи могут никогда не выводиться в интерфейсе, но они могут быть нужны для обеспечения работоспособности различных механизмов.
Сейчас мы рассмотрим методики обмена данных внутри приложения, доработав приложение из проекта P4_1, разработкой которых мы занимались в Лабораторной работе №4. Переработаем приложение для реализации следующей функциональности:
Мы можем передать параметры вызываемой странице, подготовив, во-первых, саму эту страницу к приему параметров, во-вторых – передав эти параметры при её вызове. Мы реализовали эту функциональность при вызове страницы 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);
}
}
}
В предыдущем примере, где мы использовали ту же страницу для демонстрации возможности отмены навигации, мы производили проверку заполнения в соответствующем событии. Теперь мы производим проверку на то, заполнено ли поле, еще до вызова команды навигации. Если поле не заполнено, мы выводим соответствующее сообщение. Если заполнено – формируем строку вызова страницы 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()
{
При создании объекта MyBrush мы инициализировали его цветом Green из системного перечисления Colors, то есть, по умолчанию цвет кисти будет зеленым.
В Листинге 19.3 приведен код страницы CommonPage.xaml (рис. 9.1.), здесь нас интересуют прямоугольник и текстовое поле.
(рис 19.1) Обновленный внешний вид страницы CommonPage.xaml
<phone:PhoneApplicationPage
x:Class="P4_1.CommonPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True">
<!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel содержит имя приложения и заголовок страницы-->
<StackPanel Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="НАВИГАЦИЯ" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock Text="страница" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel – поместите здесь дополнительное содержимое-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBlock x:Name="txtUserName" HorizontalAlignment="Left" Margin="10,10,0,0"
TextWrapping="Wrap" VerticalAlignment="Top"
Height="50" Width="446"/>
<Rectangle x:Name="rectColor" HorizontalAlignment="Left"
Height="111" Margin="141,156,0,0" Stroke="Black"
VerticalAlignment="Top" Width="183" Fill="#FFF4F4F5"/>
</Grid>
</Grid>
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True" Mode="Minimized">
<shell:ApplicationBarIconButton IconUri="/Images/questionmark.png"
Text="О программе" Click="ApplicationBarIconButton_Click"/>
<shell:ApplicationBar.MenuItems>
<shell:ApplicationBarMenuItem Text="Настройки" Click="ApplicationBarMenuItem_Click"/>
<shell:ApplicationBarMenuItem Text="Команда меню"/>
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
</phone:PhoneApplicationPage>
Для разбора параметров, которые переданы странице при вызове её со страницы MainPage.xaml мы применяем обработчик события OnNavigatedTo. Там же мы получаем значение общего поля MyBrush из класса App и применяем его к прямоугольнику (Листинг 10.4).
using System;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using System.Collections.Generic;
using Microsoft.Phone.Shell;
namespace P4_1
{
public partial class CommonPage : PhoneApplicationPage
{
public CommonPage()
{
InitializeComponent();
}
private void ApplicationBarMenuItem_Click(object sender, EventArgs e)
{
NavigationService.Navigate(new Uri("/Pages/Settings.xaml", UriKind.Relative));
}
private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
NavigationService.Navigate(new Uri("/About.xaml", UriKind.Relative));
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
IDictionary<string, string> parameters = this.NavigationContext.QueryString;
if (parameters.ContainsKey("User_name"))
{
txtUserName.Text = "Здравствуйте, "+parameters["User_name"];
}
rectColor.Fill = (Application.Current as App).MyBrush;
base.OnNavigatedTo(e);
}
}
}
Для работы со словарем (объект типа IDictionary) мы, в обработчике события OnNavigatedTo подключили пространство имен System.Collections.Generic. В словаре оказываются параметры, переданные странице при вызове. Далее мы проверяем, имеется ли в словаре ключ "User_name" (регистр символов имеет значение), если имеется – записываем в поле txtUserName текст приветствия с именем пользователя, обратившись к соответствующему элементу словаря по ключу.
Далее, в том же обработчике, мы назначаем свойству Fill прямоугольника rectColor кисть, которая определена в классе App.
На странице Settings.xaml, рис. 9.2, (Листинг 19.5), мы разместили элемент управления ColorPicker с именем cpMy (его можно найти в пакете элементов управления Coding4Fun, в одной из предыдущих работ мы рассматривали использование пакетов элементов управления сторонних разработчиков).
(рис 19.2) Обновленный внешний вид страницы Settings.xaml
<phone:PhoneApplicationPage
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Controls="clr-namespace:Coding4Fun.Toolkit.Controls;assembly=Coding4Fun.Toolkit.Controls"
x:Class="P4_1.Pages.Settings"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<!--Элемент управления Pivot-->
<phone:Pivot Title="НАВИГАЦИЯ">
<!--Первый элемент Pivot-->
<phone:PivotItem Header="цвет">
<Controls:ColorPicker x:Name="cpMy" HorizontalAlignment="Left" Height="603" VerticalAlignment="Top" Width="456" />
</phone:PivotItem>
<!--Второй элемент Pivot-->
<phone:PivotItem Header="размер">
<Grid/>
</phone:PivotItem>
<!--Третий элемент Pivot-->
<phone:PivotItem Header="общие">
<Button x:Name="cmdLogOut" Content="Выйти из системы" HorizontalAlignment="Left"
Height="83" Margin="52,84,0,0" VerticalAlignment="Top"
Width="259" Click="cmdLogOut_Click"/>
</phone:PivotItem>
</phone:Pivot>
</Grid>
</phone:PhoneApplicationPage>
В Листинге 19.6 вы можете видеть код страницы Settings.xaml.cs.
using System;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using System.Windows.Media;
namespace P4_1.Pages
{
public partial class Settings : PhoneApplicationPage
{
public Settings()
{
InitializeComponent();
}
private void cmdLogOut_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
if (NavigationService.CurrentSource == new Uri("/MainPage.xaml", UriKind.Relative))
{
while (NavigationService.CanGoBack)
{
NavigationService.RemoveBackEntry();
}
(Application.Current as App).MyBrush.Color = Colors.Green;
}
base.OnNavigatedFrom(e);
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
cpMy.Color = (Application.Current as App).MyBrush.Color;
base.OnNavigatedTo(e);
}
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
(Application.Current as App).MyBrush.Color = cpMy.Color;
base.OnBackKeyPress(e);
}
}
}
Здесь, при переходе на страницу мы устанавливаем свойство Color элемента управления cpMy в то значение цвета, которое хранится в кисти MyBrush, определенной в классе App. Это позволяет пользователю видеть, какой именно цвет является текущим.
Когда пользователь работает с элементом управления cpMy, мы не вызываем никаких событий, записывая выбранный в элементе управления цвет при обработке события OnBackKeyPress. В данном случае выбор пал именно на это событие лишь для того, чтобы привести пример его использования. Здесь, кроме того, можно отменить переход по кнопке Назад (хотя без наличия веских причин делать этого не следует). Для того, чтобы не замедлять навигацию по кнопке Назад, в этом событии не следует размещать код, выполнение которого способно занять некоторое время. Обновить значение цвета в общедоступной кисти мы можем и в ходе выбора этого цвета, реагируя на соответствующее событие элемента cpMy, и в обработчике события OnNavigatedFrom. В этот обработчик, в сравнении с предыдущим вариантом учебного приложения, внесено изменение, которое позволяет уточнить ситуацию очистки стека переходов. Мы проверяем, осуществляется ли переход на страницу MainPage.xaml, и если это так – очищаем стек и сбрасываем к значению по умолчанию цвет кисти. Если в сценарии, подобном нашему, не уделить внимание очистке подобного поля (или иной его обработке), окажется, что если пользователь вошёл в приложение под одной учетной записью, поработал с ним, вышел, и вошёл снова под другой учетной записью, ему могут быть доступны данные, которые введены в первом сеансе работы.
Мы рассмотрели механизмы, которые можно использовать при передаче данных внутри приложения. Один из них подходит для передачи параметров страницам при их вызове, и подразумевает построение строки параметров вызывающей страницей и обработку этих параметров вызываемой страницей. Второй подход более универсален, он подразумевает описание общедоступного поля в классе App и использование этого поля в приложении.
Продумайте систему обмена данными между страницами приложения, над котором вы работаете. Подумайте, где достаточно будет передачи данных с использованием параметров, передаваемых странице при её вызове, а где понадобится использовать общедоступное поле, объявленное в классе App. В учебных целях реализуйте оба механизма.
К данной лекции подготовлено видеоприложение и демонстрационный программный проект.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.