Презентацию к данной лекции Вы можете скачать здесь.
Не всегда программисты при создании приложений занимаются созданием
Проектировщики пользовательского
Windows Phone SDK (Software Development Kit — набор средств для разработки программного обеспечения) включает версии Visual Studio и Expression Blend, которые можно использовать для создания кода и дизайна приложения.
С точки зрения дизайна Windows Phone использует концепцию, которая в руководствах по проектированию называется
Приложения, использующие кнопки, текстовые поля и другие элементы, которые поставляются с Visual Studio, автоматически будут придерживаться требований стиля. Это большая помощь тем, кто не очень хорошо умеет проектировать дизайн. Конечно, можно полностью переопределить свойства поставляемых компонентов, но при создании приложений для Windows Phone лучше этого избегать. Существует руководство по Metro-стилю, которое доступно по адресу: http://msdn.microsoft.com/ru-ru/library/hh202915.aspx.
В этой лекции мы будем использовать средства проектирования Silverlight в составе Visual Studio. Они не дают всех возможностей создания продвинутого графического
С точки зрения программирования каждый элемент на экране является программным объектом. Объект включает поведение и данные. Если бы мы создавали приложение для управления банковскими счетами, то мы могли бы создать такой класс для хранения информации о счете:
public class Account
{
private decimal balance;
private string name;
public string GetName()
{
return name;
}
public bool SetName(string newName)
{
// в финальной версии здесь можно проверить корректность имени
name = newName;
return true;
}
// другие методы get и set
}
В этом классе хранится информация о количестве денег на банковском счете (в свойстве balance) и имя владельца счета (в свойстве name). Для создания новой записи можно использовать ключевое слово new:
Account rob = new Account();
rob.SetName("Rob");
Этот код создает новый экземпляр класса Account с именем rob. Затем задается имя владельца счета — "Rob". Использование объектов — это отличный способ представления сущностей, информацию о которых нужно хранить и обрабатывать. С помощью объектов также можно описать элементы на экране. Область отображаемого на экране текста также имеет свойства: позиция на экране, цвет текста, сам текст и др.
На рис. 3.1 представлен
(рис 3.1) Экран программы Сумматор
Каждый отдельный элемент на экране относится к классу UIElement, который представляет элементы пользовательского
Для каждого элемента задается положение на экране, размер текста и другие свойства. Можно изменить цвет текста в текстовом поле, выровнять его по левому краю, по правому краю или по центру поля, а также задать другие свойства.
Указанные элементы имеют один из типов:
Свойства этих элементов можно разделить на два типа: свойства, которые должны быть у всех элементов, например положение на экране, и свойства, которые являются специфичными для определенного типа элемента. Например, только для элемента TextBox можно задать позицию курсора для ввода текста. Можно представить все элементы в иерархической структуре, как показано на рис. 3.2.
(рис 3.2) Структура классов элементов Silverlight
Такую иерархическую структуру создали проектировщики Silverlight. Класс UIElement является классом, который может отображаться на экране как визуальный объект и принимать данные, которые вводит пользователь. На телефоне ввод информации выполняется преимущественно с сенсорного экрана.
От класса UIElement наследуется класс FrameworkElement, который содержит всю информацию, характерную для всех отображаемых элементов. Все остальные классы наследуются от него. Наследники имеют все свойства родительского класса и добавляют собственные.
Такая иерархия классов имеет ряд преимуществ. Если нужен собственный тип текстового поля, можно расширить класс TextBox и добавить в него нужные свойства и методы. При этом, система Silverlight будет обрабатывать все эти элементы так же, как и обычные текстовые поля, поскольку новые элементы сохраняют все свойства и поведение исходного класса.
Необходимо помнить, что при изменении элементов на экране и создании и управлении элементами на самом деле мы изменяем свойства объектов. При проектировании пользовательского
Создать приложение для Windows Phone очень легко. При создании нового проекта Silverlight открывается пустая страница окна дизайнера, на которую можно добавлять элементы с панели инструментов. Можно создать
(рис 3.3) Окно дизайнера Visual Studio
На рис. 3.3 показан результат перетаскивания элемента TextBox с панели инструментов в окно страницы Windows Phone. Если мы теперь запустим программу, то увидим на экране эмулятора Windows Phone страницу приложения с текстовым полем.
Процесс создания
После добавления элементов на экран рекомендуется дать элементам имена. Среда проектирования даст каждому элементу имена по умолчанию, например, TextBox1, которые лучше изменить на осмысленные, подобрав каждому элементу имя на основе его назначения.
Для того чтобы изменить свойства элементов, нужно щелкнуть по элементу в окне дизайнера и затем найти нужное свойство в области свойств в Visual Studio.
(рис 3.4) Область свойств элемента TextBox
На рис. 3.4 изображена область свойств для верхнего элемента TextBox на странице. Имя элемента отображается в верхней части окна. Изменим имя этого текстового поля на firstNumberTextBox. При этом, изменение значения свойства Name переопределит имя переменной, связанной с этим элементом:
TextBox firstNumberTextBox;
Visual Studio отслеживает объявления фактических переменных, которые представляют создаваемые отображаемые элементы, и нам не нужно думать о том, где хранятся соответствующие объявления этих переменных.
После переименования переменной, представляющей текстовое поле, можно настроить ее свойства: ширину, отступы от краев и т.д. Значения свойств отражают текущую позицию и размер элемента на экране. Если перетащить элемент за его край, значения свойств изменятся. Если изменить значения в окне Свойства, то элемент в окне дизайнера автоматически изменит положение. Точно также происходит и при создании приложения Windows Forms. Любые изменения в окне дизайнера приводят к изменению содержимого объекта.
Свойства в Silverlight и свойства в C#. Когда мы говорим о свойствах элементов Silverlight на странице (например, текст в поле TextBox), мы фактически говорим о значениях свойств в классе, которые содержатся в элементе TextBox. Другими словами, если программа содержит такое объявление:
resultTextBlock.Text = "0";
запустится метод Set объекта resultTextBlock, который устанавливает текст элемента TextBlock в соответствующее значение.
Классы и свойства в C#. Классы в C# могут содержать данные (имя владельца банковского счета) и поведение (методы GetName и SetName, которые позволяют программе узнавать имя и изменить это имя). Данные в классе представляются в виде свойств, с которым работать проще, чем использовать методы Get и Set. Они активно используются в элементах управлении Silverlight.
Свойство — это член класса, который содержит значение. Можно использовать переменные для хранения значений, но нужно сделать их публичными (public), чтобы их можно было использовать в приложениях. Например, банк может захотеть отслеживать информацию о сотрудниках. Один из параметров, значение которого может понадобиться отслеживать, — возраст владельца банковского счета. Можно объявить в классе публичное поле:
public class Account
{
public int Age;
}
Класс Account содержит общедоступное поле Age. Можно получить доступ к этому полю по его имени:
Account s = new Account(); s.Age = 21;
Проблема заключается в том, что в поле для хранения возраста можно записать недопустимое значение:
s.Age = –100210232;
Поскольку поле является общедоступным, нет возможности воспрепятствовать подобному действию.
Создание методов get и set. Чтобы контролировать использование полей, можно создать методы get и set и сделать их общедоступными. Они предоставляют возможность управлять доступом к полю. При этом, поле Age лучше сделать закрытым (private), чтобы к нему нельзя было получить прямой доступ за пределами класса.
public class Account
{
private int age;
public int GetAge()
{
return this.age;
}
public void SetAge(int inAge)
{
if ((inAge > 0) (inAge < 120))
{
this.age = inAge;
}
}
}
Теперь можно контролировать доступ к нашему полю, но для этого нужно написать много дополнительного кода. Для того чтобы получить доступ к значению возраста, необходимо вызвать созданные методы:
Account s = new Account();
s.SetAge(21);
Console.WriteLine("Возраст: " + s.GetAge());
Свойства позволяют сделать управление данными более простым. Свойство Age можно объявить следующим образом:
public class Account
{
private int ageValue;
public int Age
{
set
{
if ((value > 0) (value < 120))
ageValue = value;
}
get
{
return ageValue;
}
}
}
Здесь значение возраста является свойством. В свойстве объявлены секции для записи и чтения его значения. Описанные в этих секциях действия эквиваленты описанным ранее методам. При этом, свойства используются так же, как и обычные поля:
Account s = new Account();
s.Age = 21;
Console.WriteLine("Возраст: " + s.Age);
Когда свойству Age присваивается значение, вызывается код секции set. Ключевое слово value обозначает значение, которое присваивается свойству. При чтении значения свойства Age происходит вызов кода секции get. Такой подход сочетает преимущества использования методов и позволяет работать со свойствами так же просто, как и с полями класса.
Проверка правильности данных в свойствах. При попытке задать недопустимое значение возраста (например, 150), приведенный выше код выполнит проверку допустимости и отклонит это значение (никто старше 120 лет не может иметь счет в нашем банке), оставив прежнее значение возраста. Единственный способ узнать, было ли свойству присвоено значение, заключается в проверке значения свойства после этой операции:
Account s = new Account();
int newAge = 150;
s.Age = newAge;
if (s.Age != newAge)
Console.WriteLine("Значение возраста не было установлено");
Приведенный код пытается присвоить возрасту недопустимое значение 150, после чего проверяется, было ли это значение установлено. Если бы для присваивания значения использовался метод Set, он мог бы вернуть значение false в случае неудачи, а при использовании свойства пользователь должен выполнить чуть больше дополнительной работы.
Различные способы считывания значения свойства. Свойства позволяют выполнять и другие полезные действия.
public int AgeInMonths
{
get
{
return this.ageValue * 12;
}
}
Здесь описано новое свойство AgeInMonths. Оно предназначено только для чтения, так как не содержит секции set. Оно возвращает значение возраста в месяцах, используя то же самое значение, что и свойство Age. Это означает, что можно использовать несколько различных способов для получения одного и того же значения. Можно создать свойства только для чтения без возможности их изменения напрямую, а также свойства только для записи, хотя последние используются редко.
Свойства визуальных элементов. Свойства имеет смысл использовать в описании банковского счета, где нужно защитить данные в объектах. Но в программе Silverlight можно ввести любой текст в элемент TextBlock, и вроде бы нет нужды проверять допустимость вводимого значения. Выполнение этого кода замедлит процесс ввода значения. Так, сделав значение Text публичной строкой, программа содержала бы меньше кода и работала быстрее.
Но при этом, когда мы изменяем текст в элементе TextBlock, мы хотим, чтобы текст на странице Silverlight также изменился, например, когда программа Сумматор выведет на экран результат. Если бы программа просто изменила значение поля, система Silverlight никак не могла бы узнать, что сообщение на экране должно быть обновлено.
Однако, если Text сделать свойством, при обновлении значения элемента TextBlock запустится соответствующий метод, который может обновить хранимое значение текстового поля и вызвать метод для обновления экрана, чтобы отобразить новое значение. Свойства предоставляют возможность управления объектом при изменении его значения. Простая операция:
resultTextBlock.Text = "0";
может привести к выполнению нескольких сотен операций C#, поскольку сохранение нового значения в элементе TextBlock приводит к запуску операций для обновления изображения на экране.
Мы можем завершить страницу программы Сумматор, перетаскивая нужные элементы на экран и устанавливая их свойства. Первым делом после перетаскивания элемента на страницу рекомендуется определить имя этого элемента. Признаком плохого стиля программы является страница, содержащая много элементов с именами типа Button1, Button2 и т.д.
Разработка страницы является несложной задачей, которая сводится к перетаскиванию элементов на страницу и настройке свойств каждого элемента. Средства Silverlight позволяют добавить к элементам графические свойства, которые могут сделать их прозрачными, добавить изображения к их фону и даже сделать их анимированными.
Проектирование дизайна на Silverlight состоит из манипуляций с элементами с помощью дизайнера Visual Studio и присваивания значений нужным свойствам элементов. Выполняя эти действия, можно создать любой пользовательский
Такое разделение является хорошей идеей, поскольку нельзя гарантировать, что хороший программист будет хорошим дизайнером. Обычно над созданием приложений работают и дизайнеры, и программисты. При этом возникает проблема разделения работы между ними: программист не может ничего делать, пока дизайнер не закончит создание всех страниц приложения.
Содержимое файла
<TextBox Height="72" HorizontalAlignment="Left" Margin="8,19,0,0"
Name="firstNumberTextBox" Text="0" VerticalAlignment="Top" Width="460"
TextAlignment="Center" />
Если сравнить информацию в области свойств со значениями атрибутов в коде
При компиляции программы XAML-файл преобразуется в файл, содержащий низкоуровневые инструкции, которые создают необходимые элементы для работы программы. Объявление элементов страницы в файле
Под понятием расширяемый язык разметки подразумевается, что можно использовать правила языка для создания конструкций, которые описывают что-либо. Английский язык для этого хорошо походит. Он состоит из букв и знаков препинания, которые являются символами текста английского языка. Также в языке есть правила (их называют грамматикой), которые определяют, как составить слова и предложения. Существуют различные виды слов. Есть существительные, которые описывают предметы, и глаголы, которые описывают действия. Когда появляется что-то новое, мы придумываем новые слова для того, чтобы описать это.
Языки, основанные на XML (eXtensible Markup Language — расширяемый язык разметки), являются расширяемыми в том смысле, что мы можем придумать новые слова и фразы, которые подчиняются правилам языка, и использовать эти новые конструкции для описания того, что нам нужно. Их называют языками разметки, потому что они часто используются для описания расположения элементов на странице. Слово "разметка" первоначально использовалось при печати. Практически самым известным языком разметки является HTML — язык разметки гипертекста (HyperText Markup Language), который используется во всемирной паутине для описания формата веб-страниц.
Программисты часто создают свои собственные форматы хранения данных, используя XML. В качестве примера рассмотрим фрагмент XML-файла, в котором представлен список рекордов:
<?xml version="1.0" encoding="us-ascii" ?>
<HighScoreRecords count="2">
<HighScore game="Breakout">
<playername>Rob Miles</playername>
<score>1500</score>
</HighScore>
<HighScore game="Space Invaders">
<playername>Rob Miles</playername>
<score>4500</score>
</HighScore>
</HighScoreRecords>
В этом файле элемент HighScoreRecords содержит два элемента HighScore: один для игры Breakout и один для игры Space Invaders. Оба элемента HighScore содержатся внутри элемента HighScoreRecords. У каждого элементов есть атрибут, который определяет название игры, и два вложенных элемента: имя игрока playername и количество набранных очков score. Этот текст довольно легко понять.
В самой первой строке файла указана версия стандарта XML и используемая кодировка символов.
<TextBox Height="72" HorizontalAlignment="Left" Margin="8,19,0,0"
Name="firstNumberTextBox" Text="0" VerticalAlignment="Top" Width="460"
TextAlignment="Center" />
Если посмотреть на описание элемента TextBox, можно увидеть, что создатели языка
XML-схема. Стандарт XML также содержит описания, как создать схему, которая описывает особый формат документа. Например, в схеме для информации о рекордах можно указать, что элемент HighScore должен содержать элемент PlayerName, атрибут Score и необязательный атрибут Date, в котором может храниться информация о дате установленного рекорда.
Система стандарта формата и схемы означает, что разработчики могут легко создавать форматы данных для конкретных целей. Этому способствует факт, что существует много инструментальных средств, которых помогают создавать документы и схемы. Среда .NET даже предоставляет программам возможность сохранения объектов в виде отформатированных XML-документов. Даже файл решения Visual Studio хранится как XML-документ.
Язык
При этом, в
С помощью
Для того чтобы приложение выполняло какие-то действия, нужно добавить код программы на языке C#, который выполнит необходимую работу. Когда Visual Studio создает файл
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
namespace PhoneApp1
{
public partial class MainPage : PhoneApplicationPage
{
// Конструктор
public MainPage()
{
InitializeComponent();
}
}
}
Большую часть файла занимают инструкции using, которые позволяют программе напрямую обращаться к классам без необходимости указывать полный путь к ним. Например, вместо того чтобы записать System.Windows.Controls.Button, можно написать просто Button, потому что файл содержит строку
using System.Windows.Controls;
Единственный метод в программе — конструктор класса MainPage, который вызывается при создании класса. В конструкторе вызывается метод InitializeComponent, который создает экземпляры визуальных элементов. Этот код автоматически создает Visual Studio на основе XAML-файла, который описывает структуру страницы. Код этого метода не рекомендуется изменять напрямую, поскольку это может привести к ошибкам при выполнении программы.
Не нужно беспокоиться о том, как создаются и выводятся на экран визуальные объекты. Достаточно использовать высокоуровневые инструменты или научиться писать XAML-код для создания
Рассмотрим процесс создания
(рис 3.5) Экран программы Сумматор с открытой экранной клавиатурой
Если прикоснуться к элементу TextBox, появится экранная клавиатура, с помощью которой можно ввести числа в поля. Если мы прикоснемся к другой области экрана, клавиатура исчезнет. Однако, при нажатии на кнопку сумма мы не получим результат, поскольку приложение "не знает", что оно должно выполнять вычисления.
Необходимо создать программный код для выполнения необходимых вычислений и вывода на экран результата:
private void calculateResult()
{
float v1 = float.Parse(firstNumberTextBox.Text);
float v2 = float.Parse(secondNumberTextBox.Text);
float result = v1 + v2;
resultTextBlock.Text = result.ToString();
}
Объекты TextBox работают со значением свойства Text, доступным для чтения и записи. При записи значения в свойство Text текст в текстовом поле изменится, а при считывании значения этого свойства программа получает значение, которое было введено в это поле.
Текст имеет строковый тип, который нужно преобразовать в числовое значение, для того чтобы можно было выполнить операцию сложения. Для этого используется метод Parse, который принимает в качестве параметра строку и возвращает записанное в строке число. Метод Parse есть у каждого из числовых типов (int, float, double и т.д.). Наша программа Сумматор может работать как с целыми, так и с дробными числами. Метод Parse класса float преобразует введенные в текстовые поля значения в численный тип и складывает их.
После этого, метод преобразует полученное значение в строку и записывает ее в свойство Text элемента resultTextBlock. Метод ToString противоположен Parse. Он возвращает текст, который описывает содержание объекта. Для типа float метод возвращает численное значение, записанное в строке.
В результате, мы получили код, который выполняет вычисления и получает результат. Теперь нужно, чтобы этот код выполнялся, когда пользователь нажимает на кнопку сумма.
Во времена консольных приложений программа всегда запускалась с самого начала, работала некоторое время и затем завершала свою работу. Но теперь в нашем распоряжении есть богатые пользовательские интерфейсы с большим количеством кнопок и других элементов для взаимодействия с пользователями. В этой ситуации очень трудно написать программу, которая проверяла бы последовательно каждый элемент
Использование событий существенно облегчает создание программ. Программа не должна проверять каждый элемент на экране, чтобы узнать, выполнил ли пользователь над ним какие-то действия — вместо этого программа просто отвечает на генерируемые
Чтобы заставить
В C# событие отправляется объекту посредством вызова метода этого объекта. В нашей программе Сумматор когда пользователь нажимает на кнопку сумма, программа должна вызвать нужный метод, например, метод calculateResult.
Можно использовать редактор Visual Studio: чтобы связать метод с событием щелчка кнопки мыши, нужно дважды щелкнуть по этой кнопке в окне дизайнера. При этом, Visual Studio устанавливает свойства кнопки в
Теперь нужно просто добавить следующий код, который выполнит необходимые действия:
private void calculateResult()
{
float v1 = float.Parse(firstNumberTextBox.Text);
float v2 = float.Parse(secondNumberTextBox.Text);
float result = v1 + v2;
resultTextBlock.Text = result.ToString();
}
private void equalsButton_Click(object sender, RoutedEventArgs e)
{
calculateResult();
}
Созданному обработчику событий Visual Studio автоматически присваивает имя, которое формируется из имени элемента, в конец которого добавляется текст _Click. Таким образом, по этому имени можно легко определить, каким образом он вызывается.
Теперь программа работает. Однако, если пользователь введет в текстовое поле нечисловое значение, то программа сгенерирует исключение.
Чтобы узнать, как происходит вызов событий, для начала рассмотрим свойства кнопки сумма нашего приложения. Для этого нужно нажать на кнопку в редакторе Visual Studio, и мы увидим информацию о ее свойствах (рис. 3.6).
(рис 3.6) Область свойств элемента Button
В области свойств есть две вкладки: Свойства и
(рис 3.7) События элемента Button
В этом окне событие Click связано с методом equalsButton_Click. Если нужно прекратить связь метода с событием Click, то достаточно удалить название обработчика в этом окне. Если попытаться подставить вместо указанного имени метода произвольную строку, то программа не будет скомпилирована, если метода с указанным именем не существует.
До сих пор мы руководствовались принципом, что отображаемые свойства Visual Studio связывает с файлом
<Button Content="equals" Height="72" HorizontalAlignment="Left" Margin="158,275,0,0"
Name="equalsButton" VerticalAlignment="Top" Width="160"
Click="equalsButton_Click" />
Описание кнопки теперь содержит элемент, который связывает событие Click с названием метода. Следует отметить, что, если в файле
Упражнение 1. Пользовательский интерфейс программы Калькулятор времени
Ваша компания решила создать приложение для адвокатов. Приложение должно хранить и управлять информацией о времени, которое тратит их персонал на работу с клиентами. В настоящее время адвокаты записывают в отчет количество минут, которые они потратили на работу с клиентом, и эти отчеты обрабатываются вручную. После того как адвокатам выдали телефоны на платформе Windows Phone, было решено создать простой Калькулятор времени, который они смогут использовать для расчета времени.
Адвокаты будут вводить время запуска и время окончания (в часах и минутах), и программа должна выводит на экран количество минут между этими отметками времени.
Ваш менеджер попросил Вас разработать пользовательский интерфейс Silverlight для этого приложения:
Упражнение 2. Пользовательский интерфейс калькулятора времени
Один из менеджеров по продукции считает, что телефон должен отправлять детализированную информацию о каждом временном интервале в корпоративную систему так, чтобы информация о проведенном времени могла обновляться автоматически. Менеджер решил, что нужно отправлять следующую информацию:
На сервер нужно отправлять отчеты, содержащие указанную информацию о каждой рабочей встрече.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.