Элементы управления

Сходство и различия

Несмотря на свою схожесть, .NET Compact Framework уступает в функциональности базовой библиотеке. NET Framework. Это относится и к элементам управления. К счастью, кнопки, списки и текстовые поля все же присутствуют в мобильной версии. Кро­ме того, в. NET Compact Framework 2.0 была добавлена под­держка еще нескольких элементов управления, которые отсут­ствовали в. NET Compact Framework 1.0.

* M70K£.VfcU*C «Мешкала

* *cro»ofcvsa, vb. Co<5eDOM : Мк? иювЛУя32

‘ RowerMcde Enueneratto

. . Regtery Members : <. {<egttry№li *■ fteg«ry : RejstryHJve Ечияжаес tt RegstryKeyOaes Regstfv^eyPvneflooO Ae0»tfyVe! btfKir*j Enwr*

: R^9tfy*/aJL*eOp«lon$Eft. * SetionEndedEv’eriiA.-gs. Ses&AEn&d&rcniHwxlI. ф 5e**too6ixftifi€vemAf9S: S«s»ont<xaifl£ v*ot*4an. : . 5Є5*І0ПСПСЯг»МЧЕЛи-

Ш SMIGSiUifir Gy. O.Dsta

*33 Cwyiiffeffelns

Contains information about the current user preferences. This field reads the Windows registry base key HKEY CURRENTJJSER

Contains dynamic registry datt. This Reid reads the Window* registry base key HKBY_DYN_DATA.

Contains the configuration data for the local machine. This field reads the Windows registry base key HKEY_LQCAL_MACHINE.

Contans performance Information for software components. Tnis field reads the Windows registry base key HKEY_PERFORMANCE_DATA.

Элементы управления

* Metro* */«ua«dsc FfcIO

* Mcro^.vtea&Mic Loggt % HttoKfc. VttutSasfc

Contains Information about the default user >.ts. fMri. reads. the. Window»

V53R?

Рис. 3.1. Свойства, поддерживаемые в. NET Compact Framework

Нужно помнить, что даже поддерживаемые элементы управления имеют порой ограниченные возможности. Чтобы узнать, какие свойства, методы или события не поддерживаются элементом уп-

равления, нужно запустить справочную систему, найти нужный класс и просмотреть все члены класса. Если нужное свойство под­держивается в. NET Compact Framework, то у его описания будет присутствовать значок мобильного устройства (рис. 3.1). В каче­стве примера можно открыть страницу с описанием класса Registry. Легко заметить, что поля CurrentUser, Local Machine и Users поддерживаются в. NET Compact Framework, а поля DynData и PerfomanceData — нет.

Но даже если необходимый объект поддерживается в. NET Compact Framework, то все равно следует внимательно ознакомиться с его опи­санием. Например, поле Local Machine поддерживается только в. NET Compact Framework 2.0, поэтому при разработке нужно решить, стоит ли использовать это поле (рис. 3.2).

Рис. 3.2. Просмотр поддержки версий. NET Compact Framework

Элементы управления

Ф MfrCKtLVBugRseVSa ft

* MtrQMfcV»

* wfcVfe. Vb. G(Xfc0QM №МСТО»УЇЛМП32

I M lfw»^ooKr’ed«nd№4

: Po*^mod^ian5)ed€vw — Pw^erttoJesCrwrefa»

:

5*Sissy Member*

! * RegKryBfkH { 5fcReg»yMetf»c&

: ftegatryttvt

RegetryKevPwnfciiofK? ftejjrt’yVaiyeKivJ bxifTH ОДвгуШигОДОге Ef*:

* SenjGriEnde&vtfntA;3s

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone,

Windows Server 2003, Windows XP Med. a Center Edition,

Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The. NET Framework does not support all versions of every platform. For a list of the supported versions, see £у^ЛіБЕВМІШ£££!&>

і

I ««Version Information

1

.NET Framework

Supported in: 2.0, l. l, 1.0

}

В следующем списке перечислены элементы управления, которые не входят в состав классов библиотеки. NET Compact Framework 1.0:

□ CheckedListBox;

□ ColorDialog;

□ ErrorProvider;

□ FontDialog;

□ GroupBox;

□ HelpProvider;

□ LinkLabel (поддерживается в NET Compact Framework 2.0);

□ NotificationBubble;

□ Notify icon;

□ элементы управления, связанные с печатью;

□ RichTextBox;

□ Spl і tter (поддерживается в. NET Compact Framework 2.0).

В Compact. NET Framework 2.0 были добавлены новые элементы

управления, которые перечислены в следующем списке.

□ MonthCal endar — месячный календарь, позволяющий в наглядном виде выбрать необходимую дату.

□ DateTі mePi cker — элемент для выбора даты и времени. Он достаточ­но компактен, что позволяет широко использовать его в приложе­ниях.

□ WebBrowser — элемент, который реализует функциональность браузера.

□ Noti f’і cati on — элемент, с помощью которого приложение может посылать пользователю различные уведомления без остановки текущей запущенной программы. Уведомления могут отобра­жаться как обычным текстом, так и в формате HTML.

□ DocumentLi st — элемент управления, обеспечивающий стандартный механизм для управления файлами. Пример работы данного эле­мента можно увидеть при открытии файлов в приложениях Excel Mobile и Word Mobile. Элемент DocumentLi st позволяет перемещать­ся по файловой системе и выполнять стандартные файловые опе­рации.

□ DataGrid — элемент для отображения данных в табличном виде. Теперь может использоваться и в приложениях для смартфонов.

□ LinkLabel — элемент управления для создания гипертекстовых ссылок.

□ Spl і tter — элемент управления, позволяющий изменять разме­ры других элементов.

□ HardwareButton — элемент управления, позволяющий управлять кнопками карманного компьютера.

Урезанная функциональность элементов управления

Кроме отсутствия некоторых элементов управления, в. NET Compact Framework также была урезана функциональность имею­щихся элементов. Наиболее часто употребляемые элементы управ­ления с урезанной функциональностью приведены в следующем списке:

□ AcceptButton;

□ Cancel Button;

□ AutoScrol 1 (поддерживается в. NET Compact Framework 2.0);

□ Anchor (поддерживается в. NET Compact Framework 2.0);

□ элементы Multiple Document Interface (MDI);

□ KeyPreview (поддерживается в. NET Compact Framework 2.0);

□ Tablndex (поддерживается в. NET Compact Framework 2.0);

□ TabStop (поддерживается в. NET Compact Framework 2.0).

Также наложены ограничения на технологию drag and drop и на поддержку графики. Во многих классах поддерживаются не все свойства, события и методы.

Однако в. NET Compact Framework 2.0 ограничений стало меньше. Например, элементы управления теперь обладают свойствами Tablndex и TabStop.

Элемент Form

Элемент Form является контейнером для элементов управления и является рабочей площадкой для создания пользовательского ин­терфейса программы. Класс Form имеет несколько свойств, которые мо­гут различаться в зависимости от выбранной целевой платформы.

Свойство FormBorderStyle

Свойство FormBorderSytl е определяет стиль формы. По умолчанию используется стиль FormBorderStyle. FixedSingle. При этом форма заполняет все рабочее место экрана, и пользователь не может изме­нять размеры формы или перемещать ее по экрану. При установке значения FormBorderStyl е. None создается форма без рамки и заголов­ка. В этом случае можно изменять размеры и расположение формы

программно, но пользователь по-прежнему не может манипулиро­вать формой.

Свойство ControlBox

Свойство ControlBox отвечает за отображение контейнера для эле­мента управления. Если свойство ControlBox имеет значение True, то контейнер будет отображаться. В противном случае он на экран не выводится. Для устройств Pocket PC подобный контейнер мо­жет содержать только одну кнопку.

Свойства MinimizeBox и MaximizeBox

В приложениях для Pocket PC форма может содержать только одну кнопку. Она отвечает либо за минимизацию формы, либо за ее за­крытие. Разработчик может управлять внешним видом кнопки при помощи свойства Minimi zeBox. Если оно имеет значение Т rue, то кноп­ка при нажатии будет сворачивать форму. Значение Fal se позволя­ет создавать кнопку закрытия формы. Значение свойства Maxi mi zeBox игнорируется системой.

Свойство WindowsState

Свойство WindowsState определяет состояние окна при первона­чальной загрузке. Разработчик может использовать значения FormWindowState. Normal и FormWindowState. Maximized. Если свойство имеет значение FormWi ndowState. Normal то форма заполняет весь эк­ран, за исключением нижней полоски меню и верхней полоски системного меню Start (Пуск). При использовании значения FormWi ndowState. Maxi mi zed форма заполняет экран полностью, скры­вая системное меню Start (Пуск), но при этом нижняя полоса меню остается видимой.

Размеры и расположение формы

Свойство Size позволяет задавать размеры формы. Это свойство игнорируется, если свойство FormBorderStyle имеет значение FixedSingleProperty.

Свойство Location задает координаты верхнего левого угла формы. Но так как форма обычно заполняет весь экран, то в большинстве случаев это свойство не используется.

Элементы управления

В этом разделе будут рассмотрены основные элементы управления, которые используются для формирования пользовательского ин­терфейса. Особое внимание будет уделено различиям и особенно­стям поведения этих элементов.

Элемент Button

Для создания обычной кнопки используется класс System. Win­dows. Forms. Button. Эта кнопка обладает всеми основными функци­ями, которые есть у такого же класса в полной версии. NET Framework. Кнопка предназначена для обработки нажатия стилуса на соответствующую область экрана. В этом случае возникает со­бытие Cl ick. Код, приведенный в листинге 3.1, является обработчи­ком этого события. Он выводит текущее время в текстовое поле после нажатия на кнопку с надписью Узнать время.

Листинг 3.1

private void butGetTime_Click(object sender, EventArgs e)

{

txtCurTime. Text = DateTime. Now. ToLongTimeStringO:

}

Рисунок 3.3 показывает приложение в момент нажатия на кнопку.

Элементы управления

ii_____________

Рис. 3.3. Результат нажатия на кнопку

Текст на кнопке может быть только однострочным. Если он не по­мещается на кнопке, то будет обрезан. Поэтому нужно быть очень осторожным при выборе текста для кнопки. В следующей главе, посвященной улучшениям элементов управления, приведен при­мер создания кнопки с многострочным текстом, которая создается при помощи неуправляемого кода с использованием функций Windows API.

Функциональность элемента управления Button очень сильно уре­зана по сравнению с полной версией. NET Framework. В частности, у данного элемента нет свойств Image и ImageLi st, которые применя­ются для отображения на кнопке графики.

Элемент Т extBox

В предыдущем примере дата отображалась в текстовом поле. Это поле создается при помощи класса TextBox, который позволяет вво­дить текст. Данный элемент поддерживает такие стандартные свой­ства, как BackColor и ForeColor. Событие Cl ick элементом TextBox не поддерживается, но разработчик может воспользоваться события­ми Keypress, Key Up и Key Down. Следует отметить особенность этого элемента. Несмотря на то что класс TextBox поддерживает свойство PasswordChar, при вводе пароля на экране всегда будет использовать­ся символ звездочки. Задать другой символ не получится.

Также текстовое поле не поддерживает свойство CharacterCasing, позволяющее в автоматическом режиме преобразовывать символы текста в нужный регистр. Впрочем, данный недостаток легко ис­править, что иллюстрирует фрагмент кода, приведенный в листин­ге 3.2.

Листинг 3.2

private void txtCurTimeKeyPress(object sender. KeyPressEventArgs e)

{

if(Char. IsLetter(e. KeyChar))

{

// сохраняем текущую позицию каретки int pos * txtCurTime. SelectionStart;

// переводин в верхний регистр txtCurTime. Text = txtCurTime. Text.

Insert(txtCurTime. Selecti onStart, Char. ToUpper(e. KeyChar).ToStringO);

// перемещаем каретку в новую позицию txtCurTime. SelectionStart = pos + 1: e. Handled — true;

>

}

2-2873

ПРИМЕЧАНИЕ——————————————————————————-

У смартфонов внешний вид текстовых полей несколько отличается от стандартного вида. В частности, текстовое поле не имеет окантовки, Более подробно о текстовых полях в приложениях для смартфонов рассказывается в соответствующей главе

Элемент Label

В рассмотренном примере также использовался элемент Label для отображения текстовой строки. Как правило, надпись использует­ся для отображения некоторого текста, который пользователь не может изменить. Сама отображаемая строка задается при помощи свойства Text. Текст на экране можно выравнивать с помощью свой­ства TextAl ign. Разработчик может использовать значения TopLeft, TopCenter и TopRight. При изменении текста в метке инициируется событие TextChanged. При создании элемента нужно следить за дли­ной отображаемой строки. Если текст слишком большой и не поме­щается в пределах элемента, то он попросту обрезается.

В отличие от полной версии. NET Framework, элемент Label в. NET Compact Framework не поддерживает такие свойства, как AutoSize, BorderStyle, Image, ImageLlst и многие другие. Также не под­держивается событие Cl ick. Впрочем, на практике редко возникает нужда в обработке этого события.

Элемент RadioButton

Элемент управления RadioButton позволяет создавать переключа­тели, объединенные в группы Вся группа переключателей должна располагаться в контейнере Примером такого контейнера может служить сама форма, но чаще используется элемент Panel.

Когда пользователь выбирает один переключатель, то остальные переключатели в контейнере автоматически переводятся в выклю­ченное состояние. Приложение может иметь несколько групп эле­ментов RadioButton. В любом случае группы переключателей не за­висят друг от друга.

При изменении состояния переключателя в классе RadioButton ини­циируются события Cl ick и CheckedChanged. Событие Cl ick возника­ет, когда пользователь щелкает стилусом на самом переключателе. Событие CheckedChanged возникает, когда состояние элемента RadioButton меняется программно или в результате действий пользо-

вателя. Событие Cl іск не инициируется, когда свойство CheckedChar — ged меняется программно.

Для демонстрации примера работы с элементом RadioButton можно создать аналог популярной телеигры «Кто хочет стать миллионером?». На экране будет отображаться вопрос, а пользователь должен выб­рать из представленных вариантов единственный правильный ответ. Код, реализующий основную функциональность приложения, приве­ден в листинге 3.3.

Листинг 3.3

private void radClubl_CheckedChanged(object sender, EventArgs e)

{

if (this. radClubl. Checked)

MessageBox. Show ("Увы, вы проиграли”. “Ошибка!");

}

private void radClub2_CheckedChanged(object sender, EventArgs e)

{

if (this. radClub2.Checked)

MessageBox. Show ("Поздравляю! Вы выиграли миллион!", "Миллион!");

}

private void radClub3_CheckedChanged(object sender. EventArgs e)

{

if (this. radClub3.Checked)

MessageBox. Show ("Увы, вы проиграли", "Ошибка!");

}

private void radClub4_CheckedChanged(object sender. EventArgs e)

{

if (this. radClub4.Checked)

MessageBox. Show ("Увы, вы проиграли","Ошибка!");

}

На рис. 3.4 показан внешний вид этого приложения.

В полной версии. NET Framework в качестве контейнера для пере­ключателей часто используется элемент GroupBox, который на дан­ный момент не поддерживается в библиотеке. NET Compact

Framework. Также не поддерживаются некоторые свойства, к кото­рым относятся Appearance, Image и ImageList.

Кто стал чемпионом России по футболу а 2005 гаду?

Мияпуюн!

I Поздравляю! Вы в “ грали 1

1 миллион!

OnoJ

©ЦСКА О Спартак О Зенит

Рис. 3.4. Демонстрация работы независимых переключателей

Элемент Panel

Элемент управления Panel используется в качестве контейнера для размещения других элементов управления. Так как. NET Compact Framework не поддерживает элемент управления GroupBox, то для группировки таких элементов, как переключатели RadioButton, при­ходится использовать именно Panel.

В версии. NET Compact Framework элемент не поддерживает свой­ства BorderStyle, BackGround Image и AutoScroll.

Элемент CheckBox

Элемент управления CheckBox позволяет создавать независимый пере­ключатель в виде флажка. Элемент CheckBox имеет свойство CheckState, позволяющее определить состояние переключателя. Программист может использоваться значения Unchecked, Checked и Indetermi nate. Зна­чение Unchecked свидетельствует о том, что флажок в переключателе не взведен. Если переключатель все же включен, то используется зна­чение Checked. Но значение Indeterminate требует некоторых поясне­ний. Состояние Indeterminate используется, когда для свойства ThreeState элемента CheckBox установлено значение Тrue. Если свойство CheckState имеет значение Indeterminate, то элемент окрашен серым цветом, но, тем не менее, считается помеченным. При этом пользова­тель не может изменить состояние переключателя.

Также элемент не распознает событие Click, если свойство AutoCheck имеет значение False. Для этого свойства нужно задать значение Тrue, чтобы пользователь мог пользоваться стилусом для работы с переключателем.

Также элемент также не поддерживает некоторые свойства, в част­ности, ImageIndex.

Элемент ComboBox

Элемент управления ComboBox позволяет создавать поле со списком выбора. Благодаря своей компактности этот элемент управления хорошо подходит для тех задач, когда требуется экономить место на экране. Поле со списком выглядит как обычное текстовое поле TextBox со стрелкой, которая расположена в правой части поля. Ког­да пользователь щелкает по стрелке, то открывается список с пред­варительно заданными элементами. Когда пользователь выбирает определенный пункт списка или снова щелкает по стрелке, то спи­сок снова сворачивается.

Добавлять текстовые элементы в ComboBox можно как в режиме про­ектирования, так и программно во время работы программы.

В листинге 3.4 приведен пример добавления пунктов программным путем. Для этого нужно вызвать метод Add в свойстве коллекции Items элемента ComboBox. Отдельные пункты можно удалять с помо­щью метода Remove, а чтобы удалить все пункты сразу, применяется метод Cl ear. Приведенный пример показывает, как можно добавить три строки в элемент ComboBox с именем comboBoxl.

Листинг 3.4

comboBoxl. Items. Add("Myp3HK"); comboBoxl. Items. Add("Барсик"); comboBoxl. Iterns. Add("Рыжик"):

Чтобы узнать, какой элемент выбрал пользователь, применяет­ся свойство Selectedlndex или Selectedltem. СвойствоSelectedlndex возвращает порядковый номер выбранного пункта. Этот номер можно использовать для доступа к выбранному пункту при по­мощи свойства Items. Следует помнить, что нумерация элемен­тов начинается с нуля. Пример работы со свойством Select Index приведен в листинге 3.5. Также в этом листинге показано, как можно получить доступ к выбранному пункту при помощи свой­ства Selectedltem.

Листинг 3.5

// Получим выделенный пункт с помощью SelectedIndex

string selltem — (string) cmbCats. Items[cmbCats. SelectedIndex];

MessageBox. Show(selItem);

// Второй способ — получим пункт с помощью Selectedltem string selltem = cmbCats. Selectedltem. ToStringC): MessageBox. Show(selItem):

В полной версии. NET Framework у элемента ComboBox для свойства DropDownStyle можно задавать значения Simple, DropDownList или DropDown. В. NET Compact Framework значение Simpl e не использует­ся. До выхода. NET Compact Framework 2.0 также не поддержива­лось и значение DropDown. Кроме того, по умолчанию в. NET Compact Framework применяется значение DropDownList, тогда как в полной версии. NET Framework по умолчанию используется стиль DropDown. Также не поддерживаются многие методы из основной версии биб­лиотеки. В. NET Compact Framework 2.0 у поля со списком появи­лась поддержка методов Begi nUpdate и EndUpdate, которые позволяют избежать мерцания при загрузке большого числа элементов.

ВНИМАНИЕ————————————————————————————

Внешний вид и поведение элемента ComboBox в смартфонах немно­го отличается от аналогичных элементов в КПК. Более подробно об отличиях будет рассказано в соответствующей главе.

Элемент ListBox

Элемент ComboBox хорош для приложений с ограниченными простран­ствами формы, а список Li stBox можно использовать, если на экране достаточно места для отображения всех пунктов списка. Список Li stbox сразу показывает все имеющиеся элементы списка, при не­обходимости добавляя вертикальную полоску прокрутки, если все элементы списка не могут быть отображены одновременно.

Элементы ComboBox и Li stBox имеют почти одинаковый набор свойств и методов. В листинге 3.6 показано, как можно программно доба­вить несколько строк в список ListBox.

Листинг 3.6

1stFruit. Items. Add("Яблоко"):

1stFrui t. Items. Add("Груша");

1stFruit.1terns. Add("Сливa”);

1stFruit. Iterns. Add("Персик");

Свойство Selectedlndex содержит порядковый номер выбранного элемента списка. Если указать этот индекс в коде приложения, то выбранный элемент будет немедленно выделен в списке соответ­ствующим цветом. Если никакой элемент не выбран, то свойство Selectedlndex имеет значение -1. Также класс поддерживает свой­ство Selectedltem, которое соответствует одноименному свойству класса ComboBox.

Из часто используемых свойств элемента ListBox в полной версии NET Framework можно выделить свойство Multi Column, которое не поддерживается в. NET Compact Framework. В нем отсутствует го­ризонтальная полоска прокрутки, даже если строки текста не уме­щаются в списке полностью. Также не поддерживается многостроч­ное выделение, поэтому пользователь может выбрать только один элемент списка.

Элемент NumericUpDown

Элемент Numeri cUpDown позволяет создавать счетчик с числовым полем ввода. Такой элемент интерфейса помогает пользователю быстро вы­брать число из заданного диапазона. Элемент может работать только с целыми числа типа Integer. Десятичные значения округляются.

Разработчик управляет поведением элемента NumericUpDown при по­мощи свойств Minimum, Maximum, Value и Increment. Свойства Minimum и Maximum определяют максимальное и минимальное значения элемен­та. Свойство Value содержит текущее значение в поле ввода. Свой­ство Increment определяет величину увеличения или уменьшения значения в поле, когда пользователь нажимает кнопки со стрелка­ми. Текущее значение всегда увеличивается и уменьшается на зна­чение свойства Increment, даже если результат выходит за диапа­зон, определенный свойствами Minimum и Maximum.

Пользователь также может изменить свойство Value, просто указав соответствующее значение в поле. Если это значение находится в ин­тервале между Mi ni mum и Maxi mum, тогда свойства Va 1 ue и Text изменятся в соответствии с введенным значением. Если новое значение выходит за рамки заданных значений, то свойство Text отображает введенное число, а свойство Val ue принимает значение, которое приписано свой­ству Maximum. Чтобы запретить пользователю указывать числа в поле ввода, нужно для свойства Readonly задать значение True.

При изменении значения элемента NumericUpDown инициируется со­бытие Val ueChanged. Оно возникает только в том случае, если значе­ние меняется программно или когда пользователь нажал кнопки со стрелками. При вводе числа событие не инициируется. В листинге 3.7 продемонстрирован пример использования элемента NumericUpDown и обработки события ValueChanged.

Листинг 3.7

private void numericUpDownl_ValueChanged(object sender, EventArgs e)

{

int year = (int)this. numericllpDownl. Value;

this. lblNote. Text = "Вы выбрали " + year. ToStringO + "

год";

}

На рис. 3.5 показано, как функционирует элемент NumericUpDown.

Элементы управления

Рис. 3.5. Выбор года при помощи элемента NumericUpDown

При работе с элементом Numeri cUpDown следует учитывать одну осо­бенность его функционирования. Предположим, пользователь на­жимает кнопку со стрелкой вверх, постоянно увеличивая значение счетчика на величину свойства Increment. При достижении макси­мального значения, определенного в свойстве Maximum, счетчик со­хранит значение, которое не будет отображено на экране. Теперь, когда пользователь начнет уменьшать значения с помощью кнопки со стрелкой вниз, то отчет пойдет не от максимального значения, которое отображено в поле ввода, а от последнего значения перед достижением максимума

Стоит проиллюстрировать эту ситуацию. Итак, у нас установлено текущее значение, равное 1992. Значение свойства Increment равно 6, а максимум ограничен значением 2006. Последовательные нажа­тия стрелки вверх доведут значение с 1992 до 2006. Итак, макси­мальное значение достигнуто. Теперь надо нажать кнопку со стрел­кой, направленной вниз. Казалось бы, на экране должно быть пока­зано число 2000 (2006 — 6), но следует учитывать, что перед превы­шением максимального значения счетчик запомнил число 2004 Именно от него будет отсчитываться разница, и на экране будет отображено число 1998.

Элемент DomainUpDown

Элемент DomainUpDown позволяет создавать счетчик с текстовым по­лем ввода. Этот элемент похож на элемент NumericUpDown, а его функ­циональность схожа с теми возможностями, которые предоставля­ют ComboBox или ListBox. Но в элементе DomainUpDown вместо чисел используются строки. Этот элемент очень широко применяется для построения интерфейса, так как он весьма компактен и не занима­ет много места на маленьком экране карманного компьютера. Сле­дует учитывать, что пользователь не может увидеть весь список. Если свойство Readonly имеет значение Тrue, то пользователь может выбирать только заранее заданные строки из списка. Если это свой­ство имеет значение False, то пользователь сможет добавить свой текст в поле ввода. Впрочем, напечатанный текст все равно не вой­дет в список.

Так же как и элемент Numeri cUpDown, данный элемент управления со­держит текстовое поле и две кнопки со стрелками с правой сторо­ны Пользователь может использовать эти стрелки для прокрутки списка строк или ввести в поле свой текст, если свойство Readonly имеет значение Fal se.

При создании объекта свойство Selectedlndex имеет значение -1, показывающее, что ни один элемент списка пока еще не выбран. Если нужно выделить тот или иной пункт списка при загрузке эле­мента, то в свойстве Selectedlndex нужно указать соответствующий порядковый номер. В листинге 3.8 приведен пример, иллюстрирую­щий программное добавление строк в список и методику обработ­ки события SelectedltemChanged.

Листинг 3.8

private void Forml Load(object sender. System. EventArgs e)

{

doma і nUpDownl. Iterns. Add("Item 1”); domainUpDownl. Items. AddC’Item 2”); domainUpDownl. Items. Add("Item 3”): domainUpDownl. Items. Add("Item 4");

продолжение iP —

Листинг 3.8 (продолжение)

domaіnUpDownl. Readonly — true;

}

private void domainUpDownl SelectedItemChanged( object sender, System. EventArgs e)

{

labell. Text = domainUpDownl. Selectedlndex. ToStringO; label2.Text =

domainUpDownl. Items[domainUpDownl. SelectedIndex].ToStringO:

}

Элемент ProgressBar

Элемент управления ProgressBa г предназначен для индикации процес­са выполнения какой-либо операции. Как правило, данный элемент активно используется при выполнении долгих операций, чтобы пользователь получил иллюзию контроля над работой приложения.

Чаще всего разработчик оперирует свойствами Mi ni mum, Maxi mum и Va 1 ue. Свойства Mi ni mum и Maxi mum задают минимальное и максимальное зна­чения свойства Val ue. А свойство Val ue определяет текущее значение индикатора.

Как правило, данный элемент отображается в момент начала дол­гой операции, а после ее завершения делается невидимым с помо­щью метода Hide или свойства Visible.

Для демонстрации работы индикатора прогресса было создано при­ложение, которое позволит отследить время варки яиц вкрутую. Предположим, что для варки достаточно трех минут. Нужно поло­жить яйца в воду и запустить таймер. По истечении трех минут при­ложение должно отобразить соответствующее сообщение. Основ­ной код приложения приведен в листинге 3.9.

Листинг 3.9

private void tmrCook_Tick(object sender, EventArgs e)

{

if (this. progressBarl. Value < this. progressBarl. Maximum)

{

this. progressBarl. Value += 1:

lblCounter. Text — this. progressBarl. Value. ToStringO;

}

if (this. progressBarl. Value >= this. progressBarl. Maximum) {

tmrCook. Enabled = false:

MessageBox. Show("Яйца сварились!"); this. progressBarl. Value — 0:

1Ы Counter. Text = "0":

}

}

private void butStartCl і ck (object sender, EventArgs e)

{

tmrCook. Enabled = true;

}

На рис. 3.6 показан внешний вид приложения в момент отсчета вре­мени.

0^1««

Элементы управления

Рис, 3.6. Индикатор прогресса, позволяющий сварить яйца вкрутую

Элемент StatusBar

Строка состояния выглядит как небольшая полоска в нижней час­ти приложения, в которой отображается текстовая информация для пользователя. Этот элемент интерфейса реализуется при помощи элемента StatusBar. Чтобы изменить текст в элементе StatusBar, до­статочно присвоить новое значение свойству Text. На рис. 3.7 пока­зан внешний вид приложения в тот момент, когда пользователь нажимает на кнопку, а в листинге 3.10 приведен пример кода, кото­рый меняет текст в строке состояния.

Листинг 3.10

private void butClickMe_Click(object sender, EventArgs e)

{

this. statusBarl. Text — "Вы нажали на кнопку";

}

Элементы управления

Рис. 3.7. Пример работы со строкой состояния

Строка состояния поддерживает только одну информационную панель, а также не распознает события Cl ick.

Элемент TrackBar

Элемент управления TrackBar предназначен для установки число­вого значения при помощи перемещения ползунка по числовой шкале. Основную работу с элементом разработчик выполняет при помощи свойств Minimum, Maximum и Value. Ползунок может распола­гаться как вертикально, так и горизонтально. Ориентация ползун­ка задается при помощи свойства Ori entat і on. Свойство Tі ckFrequency регулирует дистанцию между метками шкалы. По умолчанию зна­чение свойства Ті ckFrequency равно единице.

Свойства Small Change и LargeChange определяют шаг изменения зна­чения Value. Свойство Small Change задает изменения основного зна­чения, когда пользователь нажимает на одну из кнопок навигации на самом карманном компьютере или на смартфоне.

Свойство LargeChange показывает, на сколько будет изменено основ­ное значение, когда пользователь щелкнет стилусом на самом пол­зунке. При изменении значения свойства Value инициируется со­бытие ValueChanged.

Для иллюстрации работы ползунка нужно создать новый проект и разместить на форме два элемента TrackBar. Один из них будет расположен горизонтально, а второй — вертикально. При этом по­ложение ползунков на шкалах будет синхронизировано (рис. 3.8).

В листинге 3.11 приведен код, отвечающий за функциональность ползунков.

Элементы управления

Рис. 3.8. Пример работы с ползунками

Листинг 3.11

private void trackVert ValueChanged(object sender. EventArgs e) {

this. trackHoriz. Value = this. trackVert. Value;

}

private void trackHoriz_ValueChanged(object sender, EventArgs e)

{

this. trackVert. Value = this. trackHoriz. Value;

}

Когда пользователь передвинет один ползунок, то второй ползунок автоматически будет переведен в то же положение, что и первый.

Элемент ToolBar

Элемент управления ToolBar позволяет создавать собственную па­нель инструментов. Во многих случаях использование панели ин­струментов может принести разработчику больше выгод, чем при­менение меню. Следует учитывать, что панель инструментов позволяет использовать изображения, что делает работу с этим эле­ментом удобным и наглядным. В. NET Compact Framework элемент ToolBar не может содержать текст. Все инструменты маркируются только при помощи графических изображений. Изображения свя­зываются с элементом при помощи класса ImageLi st. В приложени­ях для КПК панель инструментов всегда располагается в нижней части экрана справа от пунктов меню (рис. 3.9).

Чтобы добавить в приложение элемент ToolBar, нужно сначала пе­реместить на форму элемент управления ImageLi st. Значок ImageLi st появится в нижней части окна Form Designer рядом с элементом mainMeriu. В окне редактора свойств Properties нужно выбрать свой­ство Images и нажать кнопку редактирования. В результате будет открыто диалоговое окно Image Collection Editor.

Элементы управления

Рис. 3.9. Панель инструментов в приложении

В этом окне следует добавить изображения, предназначенные для панели инструментов. Рекомендуется использовать картинки размером 16 х 16 пикселов, чтобы при их отображении не воз­никло искажений. Выбранные изображения включаются в состав приложения, и их не придется отдельно поставлять вместе с про­граммой.

Теперь на форму надо перенести элемент Tool Ваг. В его свойстве ImageList надо указать имя добавленного ранее элемента ImageList. В рассматриваемом примере использовалось имя по умолчанию ImageLi stl. Затем надо перейти к свойству Buttons и активировать окно редактора ToolBarButton Collection Editor. Так как было добавлено три изображения для кнопок, то нужно три раза нажать кнопку Add. Для каждой добавленной кнопки следует задать свойство Imagelndex. При необходимости разработчик может изменить стиль отображения кно­пок. По умолчанию используется стиль PushButton, который создает обычные кнопки. Если для кнопки задать стиль DropDownButton, то при ее нажатии будет отображаться меню или другое окно. Справа от кнопки на панели инструментов отображается стрелка.

Стиль Separator позволяет создавать разделители между кнопками на панели управления. Стиль ToggleButton позволяет создавать пе­реключаемую кнопку. При первом нажатии она переходит в акти­вированное состояние, в котором и остается до тех пор, пока кноп­ку не нажмут повторно.

Итак, панель инструментов уже готова, хотя еще не было написано ни одной строчки кода. При щелчке на кнопках элемента ToolBar возникает событие ButtonCl ick. В листинге 3.12 приведен код, обра­батывающий нажатие первых двух кнопок.

Листинг 3.12

private void tool BarlButtonCl ick (object sender.

ToolBarButtonClі ckEventArgs e)

{

if (e. Button = this. toolBarButtonl)

{

HessageBox. ShowC’Bbi выбрали первую кнопку");

}

else if (e. Button = this. toolBarButton2)

{

MessageBox. ShowC’Bbi выбрали вторую кнопку");

}

}

Элемент MainMenu

Меню является одним из самых важных элементов графического ин­терфейса Windows-приложений. Не являются исключением и про­граммы для мобильных устройств. По умолчанию на форме уже при­сутствует элемент Mai nMenu. Но при добавлении в проект новой формы на ней меню не появляется, и его нужно добавить вручную.

Следует помнить, что в приложениях для Pocket PC меню распо­лагается в нижней части окна программы, тогда как в приложениях для обычных компьютеров меню располагается в верхней части окна. Если в программе одновременно присутствуют меню и панель инструментов, то они будут отображаться вместе. Но меню будет прижато к левой границе окна, а панель инструментов — к правой. Пример работы с меню приведен в листинге 3.13.

Листинг 3.13

private void mnuAboutCl ick (object sender, EventArgs e)

{

MessageBox. Show("Это моя программа!");

}

private void mnuExitCl ick (object sender. EventArgs e)

{

this. CloseO;

}

Элемент ContextMenu

Элемент ContextMenu позволяет создавать контекстные меню для других элементов интерфейса Этот элемент очень похож на эле­мент управления Mai nMenu. Но если Mai nMenu всегда связан с формой приложения, то ContextMenu можно связать с любым элементом фор­мы. Так как в КПК не используется мышь, то вызов контекстного меню вызывается операцией tap and-hold вместо привычного щел­чка правой клавишей мыши.

ВНИМАНИЕ————————————————————————————

Если вы пользуетесь эмулятором, то для имитации tap-and-holdнуж­но щелкнуть левой кнопки мыши и не отпускать ее некоторое время.

Чтобы добавить элемент ContextMenu в приложение, нужно сначала переместить его значок на форму. Он появится в нижней части ре­дактора Form Designer, там же, где и элемент Mai nMenu. Но на самом деле во время выполнения программы контекстное меню будет ото­бражаться рядом с выбранным элементом интерфейса. Также кон­текстное меню можно создавать программно во время запуска при­ложения.

При вызове контекстного меню инициируется событие Popup. Когда пользователь выбирает какой-то пункт меню, то возникает событие Cl ick. Чтобы привязать созданное контекстное меню к конкретному элементу интерфейса, нужно выбрать его на форме и в свойстве ContextMenu указать созданное контекстное меню.

ПРИМЕЧАНИЕ——————————————————————————-

До выхода. NET Compact Framework 2.0 элемент управления ContextMenu не поддерживал свойство ContextMenu. Source Control.

Элемент Timer

Элемент Timer позволяет выполнять некоторые действия по исте­чении заданных интервалов времени. Чаще всего для работы с тай­мером разработчик применяет событие Ті ck. Данное событие ини­циируется только в том случае, если свойство Enabled имеет значение True. Если нужно остановить таймер, то достаточно при­своить данному свойству значение Fal se.

Интервал отсчета времени задается свойством Interval, а его зна­чение указывает используемый промежуток времени в миллисекун-

дах. Если рабочий интервал таймера должен составлять 3 с, то надо установить значение 3000.

Этот элемент управления уже применялся при работе с объектом ProgressBar.

Элементы OpenFileDialog и SaveFileDialog

Практически в каждом приложении пользователь должен иметь воз­можность сохранить файл или открыть его. Разработчикам регуляр­но приходится реализовывать подобную функциональность в своих программах. При желании можно самому придумать и разработать интерфейс для подобной задачи. Но можно воспользоваться и стан­дартными диалоговыми окнами открытия и сохранения файла. Именно для этого применяются элементы управления OpenFі 1 eDi а 1 од и SaveFileDialog. К сожалению, в версии. NET Compact Framework возможности данных элементов управления серьезно урезаны. Раз­работчик может манипулировать файлами только в пределах папки My Documents и вложенных папок следующего уровня. Поэтому пап­ка My DocumentsProgrammingSample будет уже недоступна.

Рассматриваемые элементы управления размещаются в нижней части дизайнера формы рядом с элементом MainMenu. При работе с данными элементами прежде всего надо позаботиться о свойстве Filter, которое ограничивает список доступных файлов, фильт­руя их по расширению. Свойство InitalDirectory содержит имя папки, в которой по умолчанию располагаются файлы. Если это свойство оставить пустым, то обзор файлов начнется с самой пап­ки My Documents.

Основным методом для этих элементов является ShowDi al од. После его вызова на экране отображается модальное окно, в котором пользова­тель должен нажать кнопку ОК или CanceL При этом метод ShowDi al од возвращает значения DialogResult. OK и DialogResult. Cancel соответ­ственно. Если получено значение DialogResul t. ОК, то пользователь на­жал кнопку ОК и в свойстве Filename содержится полный путь к вы­бранному файлу.

Пример работы с элементами OpenFileDialog и SaveFileDialog при­веден в листинге 3.14.

Листинг 3.14

private void butOpen_Click(object sender, EventArgs e)

{

ofd. Filter ■ ”DLL|*.dll|Картинки|*.jpg":

продолжение &

Листинг 3.14 (продолжение)

ofd. InitialDirectory = "WMy DocumentsWTemplates"; if (DialogResult. OK — ofd. ShowDialogO)

{

statusBarl. Text — ofd. FileName;

}

el se {

statusBarl. Text ■ "Вы нажали на кнопку Отмена!":

}

}

Элементы HScrollBar и VScrollBar

Элементы управления HScrol 1 Ваг и VScrol 1 Ваг позволяют создавать полосы прокрутки для элементов, которые изначально не облада­ют этой функциональностью. Пользоваться этими полосами про­крутки совсем не сложно. Свойство Minimum задает значение эле­мента, когда ползунок находится в крайней левой или в крайней верхней позиции, для HScrollBar или VScrollBar соответственно. Свойство Maximum, задает максимальное значение для полос про­крутки. Значение свойства Val ue зависит от положения ползунка. Оно всегда находится в диапазоне между значениями свойств Minimum и Maximum.

Когда пользователь щелкает на полосе прокрутки, то свойство Val ue изменяется в соответствии со значением, заданным в свойстве LargeChange. Когда пользователь нажимает на кнопку навигации со стрелкой, то свойство Val ue изменяется в соответствии со значени­ем, заданным в свойстве Small Change. Следует обратить внимание на то, что если ползунок находится в положении, определяемом свойством Maximum, то свойство Value не равно значению Maximum. В этом случае значение свойства Value вычисляется по формуле Maximum — LargeChange + 1.

При изменении свойства Val ue инициируется событие Val ueChanged. В листинге 3.15 приведен пример работы с полосами прокрутки.

Листинг 3.15

private void vScrollBarl_ValueChanged(object sender. EventArgs e)

{

this. 1ЫScroll. Text = this. vScrollBarl. Value. ToStringO;

На рис. 3.10 показан внешний вид приложения. Если переместить ползунок в нижнюю часть полосы прокрутки, то значение в соот­ветствии с формулой будет равно 91.

и. за ф

Элементы управления

Рис. 3.10. Пример работы с полосами прокрутки

Список рисунков (ImageList)

Элемент управления ImageLi st уже рассматривался при знакомстве с элементом ToolBar. Элемент ImageList используется для хранения коллекций растровых изображений. Как и многие другие элемен­ты, список рисунков не отображается во время выполнения про­граммы, а используется как контейнер, из которого по мере необхо­димости извлекаются хранимые изображения. Как правило, данный элемент используется совместно с такими элементами управления, как ListView, TreeView и ToolBar.

Изображения можно добавлять в элемент управления во время ра­боты приложения. Для этого используется метод Add, который вхо­дит в состав члена класса Images. Сами картинки могут располагать­ся как в отдельных файлах, так и в ресурсах приложения. В листинге 3.16 показано, как можно добавить картинку из ресурсов в ImageLi st, а затем отобразить ее в элементе интерфейса PictureBox.

Листинг 3.16

Bitmap image = new Bitmap(Assembly. GetExecutingAssembly(). GetMani festResourceStream(@"ImageLi st_CS. home. gi f")): imgLi st. Images. Add(image); picTest. Image = imgList. Images[0]:

Изображение добавляется в начало списка, и его порядковый но­мер будет равен нулю. Если в ImageList уже было одно изображе­ние, то новая картинка будет иметь порядковый номер, равный еди­нице. Это иллюстрируется листингом 3.17.

Листинг 3.17

private void butFromImageList_Click(object sender. EventArgs e) {

picTest. Image = imgList. Images[l];

}

Все картинки, находящиеся в ImageList, имеют одинаковый размер. По умолчанию используется размер 16×16 пикселов. Разработчик может изменить размеры изображений, используя свойство ImageSi ze. Если менять отображаемые картинки при помощи таймера, то мож­но даже создать небольшую мультипликацию. Для этого достаточно список рисунков заполнить набором изображений, а затем поочеред­но отображать их в графическом поле.

Элемент PictureBox

Элемент управления PictureBox используется для отображения гра­фики. Данный элемент имеет ограниченную функциональность и не позволяет растягивать картинку в соответствии с размерами графи­ческого поля.

В листинге 3.18 приведен фрагмент кода, который позволяет загру­зить изображение из графического файла.

Листинг 3.18

private void butFromFile_Click(object sender. EventArgs e)

{

picTest. Image = new Bitmap(@”Windowsbanner. gif");

}

Если использовать этот способ для добавления картинки, то нужно добавить изображение в проект и для свойства Bui Id Action в окне свойств Properties задать значение Content. В процессе подготовки приложения к инсталляции изображение будет рассматриваться как часть программы. В рассмотренном примере использовалась готовая картинка, которая находится в папке Windows.

Также можно загрузить изображение из ресурсов приложения. В этом случае надо добавить картинку в проект и для свойства Bui Id Action задать значение Embedded Resource. Тогда не придется специально вклю­чать изображения в состав инсталлятора В листинге 3.19 приведен пример, иллюстрирующий добавление изображения из ресурсов.

Листинг 3.19

private void butResClіск(object sender, EventArgs e)

{

// Загружаем из ресурсов

picTest. Image = new Bitmap(Assembly. GetExecutingAssembly(). GetMani festResourceStream("PictureBox_CS. kri sti na. jpg")):

}

Элемент ImageList имеет свойство ImageSize, которое задает разме­ры хранимых изображений. Перед загрузкой картинки в графичес­кое поле можно установить требуемые размеры изображения с по­мощью данного свойства, как показано в листинге 3.20.

Листинг 3.20

private void butlmgList Click(object sender, EventArgs e)

{

// изменяем размеры картинки

imageList1.ImageSize = new System. Drawing. Size(160, 120):

// загружаем картинку с измененными размерами picTest. Image = imageListl. Images[0];

}

На рис. 3.11 показан внешний вид приложения, в котором для ра­боты с изображениями применяются все три описанных варианта.

Элементы управления

Рис. 3.11. Пример работы с элементом PictureBox

Элемент ListView

Элемент управления ListView похож на элемент ListBox, но вместо обычного текста данный элемент может показывать изображения. Фактически, правая часть рабочего окна Проводника в Windows ХР является типичным примером использования этого органа уп­равления. Элементы в ListView могут отображаться в виде табли­цы, списка, а также как группа крупных и мелких значков. За спо­соб отображения содержимого отвечает свойство View. Значение Details позволяет отображать содержимое в виде таблицы, значе­ние List создает список, значение Largelcon позволяет отображать элементы списка в виде больших пиктограмм, а значение Smal 1 Icon отображает их как маленькие пиктограммы.

В режиме Detai 1 s элемент управления Li stV і ew позволяет создавать дополнительные столбцы. Их можно добавлять как во время про­ектирования, так и во время исполнения программы. Пример до­бавления столбцов во время работы приложения приведен в лис­тинге 3.21.

Листинг 3.21

private void Forml_Load(object sender, EventArgs e)

{

// Устанавливаем нужный вид listViewl. View = View. Details;

// Выделяем всю строку при выделении любого элемента listViewl. FullRowSelect = true;

ColumnHeader columnHeaderl = new ColumnHeaderO;

ColumnHeader columnHeader2 = new ColumnHeaderO;

ColumnHeader columnHeader3 = new ColumnHeaderO;

columnHeaderl. Text — "Фамилия"; columnHeader2.Text * "Имя"; columnHeader3.Text = "E-mail";

1 і stViewl. Columns. Add(columnHeaderl);

1 і stViewl. Columns. Add(columnHeader2);

1 і stV і ewl. Columns. Add(columnHeader3);

ListViewItem Contactl = new ListViewltem("Иванов");

Contactl. Subitems. Add("Иван");

Contactl. Subitems. Add("і vanPi vanov. ru");

ListViewItem Contact2 = new ListViewItem("Петров");

Contact2.Subitems. Add("Петр");

Contact2.Subitems. Add("peter@petrov. ru");

ListViewItem Contact3 = new ListViewItem("Сидоров");

Contact3.Subitems. Add("Арнольд");

Contact3.Subitems. Add("goatPsidorov. ru");

1 і stV і ewl. Iterns. Add(Contact1);

1 і stViewl. Items. Add(Contact2);

1 і stVi ewl. Iterns. Add(Contact3);

}

На рис. 3.12 показан внешний вид приложения со списком в виде таблицы.

УЬаное Иван lvanOtvanov. ru

Пвтрсе Петр peterCf3etrQV. ru

Сидоров Арнс^ъд OMtCsidorov. ru

Щ: S_____________ ^

Рис. 3.12. Пример работы с элементом ListView

В полной версии. NET Framework элемент управления Li stVi ew под­держивает свойство Multi Select, позволяющее одновременно выб­рать несколько элементов из списка. Версия. NET Compact Frame­work не поддерживает данное свойство, поэтому пользователь мо­жет выбрать только один элемент.

Элемент TabControl

Элемент управления TabControl очень удобен при создании интер­фейсов для устройств с малыми размерами экрана, так как он позво­ляет создавать многостраничные диалоговые окна. Вкладки, реали­зуемые этим элементом, имеют ярлычки, на которых отображаются заголовки страниц. И пользователь может легко переключаться меж­ду страничками, просто щелкая по этим ярлычкам.

В устройствах Pocket PC вкладки располагаются в нижней части окна. Следует обратить внимание на то, что элемент TabControl все­гда располагается в верхнем левом углу контейнера. Например, если поместить TabControl на форму, то он появится в ее верхнем левом углу. Если же нужно изменить расположение этого элемента, то надо поместить его на панель, которая является контейнером. При пере­мещении панели будет перемещаться и TabControl.

Элемент TabControl следует расположить на форме. У него по умолча ■ нию будут созданы вкладки tabPagel и tabPage2. Если нужно добавить новую вкладку, то следует щелкнуть на маленькой стрелке в верхней части элемента TabControl и выбрать пункт меню Add Tab (рис. 3.13).

Элементы управления

Рис. 3.13. Добавление новой закладки в элементе TabControl

В результате у элемента TabControl появится новая закладка, которую можно настроить в соответствии с потребностями разработчика. Так­же программист может воспользоваться услугами редактора TabPage Collection Editor для добавления новых закладок. В этом случае надо выбрать элемент TabControl в дизайнере формы, найти свойство TabPages и нажать кнопку редактирования этого свойства. В результате будет открыт редактор закладок. Для управления закладками можно также выделить TabControl, щелкнуть на нем правой кнопкой мыши и вы­брать пункты контекстного меню Add Tab или Remove Tab.

Для определения текущей вкладки используется свойство Select — Index. При изменении данного свойства инициируется событие Sel ectedlndexChanged, что иллюстрирует код, приведенный в листин­ге 3.22.

Листинг 3.22

private void tabControll_SelectedIndexChanged(object sender, EventArgs e)

{

swi tch (thi s. tabControl1.Selectedlndex)

{

case 0:

MessageBox. Show("Вы break;

выбрали

первую

вкладку");

case 1:

MessageBox. Show("Вы break;

выбрали

вторую

вкладку");

case 2:

MessageBox. Show("Вы break;

выбрали

третью

вкладку");

}

}

Элемент Tree View

Элемент управления TreeView позволяет представить данные в иерар­хическом виде. Именно в этом виде отображается структура дисковой системы в левой части рабочего окна программы Проводник Windows. Основой элемента TreeVi ew являются объекты TreeNode и Nodes. При работе с TreeView также широко используется элемент управления ImageList, используемый как хранилище изображений для узлов.

Заполнять древовидную структуру можно как на этапе конструи­рования формы, так и во время выполнения программы. Для созда­ния дерева в дизайнере формы нужно переместить на нее элемент TreeView. Затем следует выбрать свойство Nodes и запустить редак­тор TreeNode Editor. Кнопка Add Root отвечает за создание узлов де­рева. Кнопка Add Child позволяет добавить дочерний узел к выбран­ному узлу. Кнопка Delete удаляет выбранный узел.

Чтобы задать текст, отображаемый в узлах, можно использовать свой­ство Text Также в узлах можно использовать изображения, для чего применяется комбинация элемента управления ImageLi st и свойства Sel ectedlmageLi st. Для определения текущего узла используется свой­ство SelectedNode.

if О

Элементы управления

.НЩ

Рис. 3.14. Использование элемента TreeView

На рис. 3.14 показан внешний вид приложения, использующего эле­мент интерфейса Т reeVi ew.

Элемент InputPanel

Элемент управления InputPanel позволяет вводить текстовую ин­формацию при помощи виртуальной клавиатуры или панели рас­познавания знаков SIP (Soft Input Panel). Так как в полной версии. NET Framework данного элемента нет, то стоит рассмотреть его несколько подробнее.

Как правило, в карманных компьютерах нет клавиатуры, поэтому для ввода данных используется виртуальная клавиатура. В обыч­ном состоянии она неактивна и находится в свернутом состоянии. Чтобы ее активировать, нужно щелкнуть стилусом по значку кла­виатуры в нижнем правом углу экрана, где располагается меню или панель инструментов ToolBar. Тогда виртуальная клавиатура по­явится на экране, и пользователь сможет вводить текст.

Разработчик может программно управлять состоянием клавиатуры Например, с помощью элемента InputPanel можно узнать текущее состояние SIP, возможность ее отображения и деактивации. Свойств и методов у элемента InputPanel не так уж много, но наиболее часто используемые члены класса приведены в следующем списке.

□ Bounds — прямоугольник, определяющий размеры и позицию SIP.

□ VisibleDesktop — прямоугольная часть экрана, на которой не отображается SIP.

□ Enabl ed — возможность работы с SIP.

□ Enabl edChanged — событие, возникающее при изменении состоя­ния SIP.

Свойства Bounds и Vi si Ы eDesktop доступны только для чтения и оп­ределяют прямоугольники, по которым можно судить о положении SIP и размерах клиентской области, не занятой SIP. Свойство Vi si Ы eDesktop определяет прямоугольник, которым ограничена об­ласть экрана, не закрытая SIP. Когда виртуальная клавиатура ото­бражается, то условный прямоугольник поднимается от полоски навигации над окном SIP. Когда SIP скрыт, то прямоугольник за­нимает все пространство экрана.

Свойство Bounds описывает размеры и позицию виртуальной клавиа­туры, когда она отображается на экране. Причем размеры этого пря­моугольника не меняются, даже если виртуальная клавиатура скрыта.

Свойство Enabled имеет значение True, если виртуальная клавиату­ра отображается на экране Значение свойства можно задавать про­граммно, скрывая или отображая клавиатуру.

Если в приложении необходимо использовать элемент Input Panel, нуж­но следить, чтобы он при активации не загородил элементы управле­ния на форме, иначе пользователь просто не сможет ввести данные.

Можно размещать текстовые поля на форме как можно выше, что­бы элемент InputPanel не мешал вводить данные. Но помимо этого можно отслеживать состояние виртуальной клавиатуры и при ее отображении передвигать вверх поля для ввода информации. В этом случае чаще всего приходится применять полосы прокрутки. Мож­но проиллюстрировать такое поведение примером, в котором эле­мент InputPanel будет активироваться, если текстовое поле полу­чит фокус. А когда TextBox потеряет фокус, то клавиатура должна исчезнуть. Эта функциональность реализуется кодом, приведенным в листинге 3.23.

Листинг 3.23

private void txtTest_GotFocus(object sender, EventArgs e)

{

// Когда пользователь выбирает текстовое поле,

// то автоматически активируем SIP іnputPanell. Enabled — true;

}

private void txtTest_LostFocus(object sender. EventArgs e)

{

// При потере фокуса сворачиваем SIP іnputPanell. Enabled — false;

В этом примере пришлось добавить на форму кнопку, иначе тек­стовое поле будет автоматически получать фокус при загрузке фор­мы и приложение не будет работать так, как это задумывалось из­начально. В данном случае именно кнопка будет получать фокус ввода при загрузке формы. Но для этого надо присвоить свойству кнопки Tab Index нулевое значение.

Теперь если стилусом активировать текстовое поле, то автоматиче­ски будет отображена виртуальная клавиатура. Если на появившей­ся клавиатуре нажать клавишу Tab или щелкнуть на кнопке с надпи­сью Просто кнопка, то панель ввода автоматически свернется.

-□□□□□□□□□□пап

сспсюпппсшпгани

1» Lq. i*11,11,41,II/ I • J

Stiiltl г |к |с|»1ь|п|го| /1.1/1 «-1 си|ао| 14 l*|t| Ч-

Рис. 3.15. Пример работы с элементом InputPanel

Элемент InputPanel поддерживает событие EnabledChanged, которое возникает при акт ивации и деактивации панели ввода. С его помо­щью можно расширить функциональность примера. Следует доба­вить еще одно текстовое поле в нижнюю часть формы. Сейчас нужно отследить событие Enabl edChanged и отреагировать на него должным образом. При активации панели ввода текстовое поле должно сдви­нуться вверх, чтобы пользователь мог ввести свои данные. Пример обработки этого события приведен в листинге 3.24.

Листинг 3.24

private void inputPanell_EnabledChanged(object sender,

EventArgs

e)

{

// Отслеживаем состояние панели ввода

// Свойство Bounds возвращает размеры и позицию SIP

if (іnputPanell. Enabled = true)

this. txtJump. Top = 200 — іnputPanell. Bounds. Height; else

this. txtJump. Top = 200:

}

На рис. 3.15 показан внешний вид окна тестового приложения.

В этом примере позиция текстового поля была подобрана опытным путем, но в реальных проектах разработчик может программно вы­числить высоту формы, панели ввода, текстового поля и других элементов формы, чтобы более точно определить позицию сдвига.

Элемент управления DataGrid

Элемент управления DataGrid позволяет отображать данные в виде таблицы, как это сделано в электронной таблице MS Excel. Как и мно­гие другие элементы управления, он имеет обрезанные возможности по сравнению с полной версией. NET Framework. Например, отклю­чена поддержка свойства DataMember.

Элемент управления DataGrid может быть связан с источниками данных при помощи свойства DataSource. Рассмотрим простейший пример работы с данным элементом. Прежде всего, потребуется создать XML-файл, содержащий некоторые данные. Для примера был использован файл artists. xml, в котором содержится информа­ция о некоторых известных артистов шоу-бизнеса. Файл содержит записи о фамилии, дате рождения и адресе проживания. Создан­ный файл нужно добавить в проект, расположить на форме элемент DataGrid и присвоить ему имя grdArtists. В листинге 3.25 приведен код обработчика события FormlLoad.

Листинг 3.25

private void Forml_Load(object sender. EventArgs e)

{

Cursor. Current = Cursors. WaitCursor; try

{

// Загружаем данные DataSet DataSet ds — new DataSetO;

ds. ReadXml(@’’Program Fi1esDataGrid_CSartists. xml"); grdArtists. DataSource = ds. Tables[0];

}

catch (Exception)

{

продолжение &

Листинг 3.25 (продолжение)

MessageBox. ShowC’He ногу загрузить данные в DataGrid!", this. Text):

}

// Устанавливаем стили

DataGridTableStyle ts = new DataGridTableStyleO; ts. MappingName = "Order":

DataGridColumnStyle artistDate — new DataGri dTextBoxColumn();

artistDate. MappingName = "BirthDate"; artistDate. HeaderText = "Дата рождения": ts. Grі dColumnStyles. Add(artі stDate):

DataGridColumnStyle artistName = new DataGridTextBoxColumn():

artistName. MappingName = "ArtistName";

artistName. HeaderText = "Артист";

artistName. Width — this. Width — artistDate. Width — 35;

ts. Gri dColumnStyles. Add(artі stName);

grdArti sts. TableStyles. Add(ts);

Cursor. Current — Cursors. Default;

}

В данном примере из XML-файла извлекаются данные, относящи­еся к фамилии артиста и дате его рождения. Остальная информа­ция игнорируется. При загрузке приложения в элемент DataGri d за­писываются требуемые данные. На рис. 3.16 показан внешний вид приложения.

Элементы управления

Также стоит прочитать статью «Using the DataGrid Control in Pocket PC Applications», которую можно найти в справочной сис­теме MSDN. В этой статье иллюстрируются различные приемы про­граммирования, которые помогут расширить возможности данно­го элемента.

Элемент Splitter

Элемент управления Splitter появился только в. NET Compact Framework 2.0. В предыдущей версии его не было. Этот элемент реализует разделитель, который используется для изменения размеров закрепленных элементов управления во время выпол­нения программы. Элемент Splitter обычно используется вмес­те с элементами управления, содержащими данные переменной длины.

Элементы управления

-ta фотографии изображен кот Рыжж, который живет вместе с автором книги под одной крышей

Элементы управления

Рис. 3.17, Применение элемента Splitter в приложении

Стоит рассмотреть работу данного элемента на конкретном при­мере На форме следует расположить графическое поле Pi ctureBox и присвоить его свойству Dock значение Тор. Затем на форме надо расположить объект Splitter и его свойству Dock тоже присвоить значение Тор. Также следует расположить на форме текстовое поле TextBox. Его свойству Multiline надо присвоить значение True, а свойству Dock — значение Fi 11. Внешний вид получившегося при­ложения показан на рис. 3.17.

Даже без единой строчки написанного кода запущенное прило­жение будет вполне функционально. Если нужно увеличить об­ласть текстового поля для ввода новых данных, то достаточно на­жать стилусом на разделителе и передвинуть его чуть выше.

Элемент MonthCalendar

Элемент управления MonthCalendar появился только в последней версии. NET Compact Framework 2.0. Данный элемент позволяет легко выбрать необходимую дату.

Для создания тестового приложения на форме надо разместить эле­менты MonthCalendar и Label. Метка должна получить имя 1Ы Sel ectDate, а для свойства Text нужно задать значение Выбранная дата. Затем следу­ет дважды щелкнуть на элементе monthCalendarl, чтобы задать код об­работчика события DateChanged. Этот код приведен в листинге 3.26.

Листинг 3.26

private void monthCalendarl_DateChanged(object sender, DateRangeEventArgs e)

{

lblSelectDateіText = "Выбранная дата: " +

monthCalendarl. Selecti onStart. ToShortDateStri ng();

}

Теперь можно запустить приложение и выбрать любую дату из ме­сячного календаря. Выбранная дата будет автоматически отобра­жаться в надписи lbl Sel ectDate, как показано на рис. 3.18.

Элементы управления

ГЯ 27 2S 74 Г» 1

2 3 4 5 6 7 8

9 10 11 12 13 14 15

16 17 18 19 20 21 22

23 24 25 26Ш2В 29 30 31 1 £ Э ■» Ч

Today: 5/16/06

U — , и дата; 7/27/06

Элементы управления

Рис. 3.18. Выбираем дату из месячного календаря

Элемент DateTimePicker

Элемент управления DateTimePicker также является новым элемен­том, который появился в. NET Compact Framework 2.0. Он позво­ляет выбирать не только дату, но и время.

На форме надо разместить элемент DateTimePicker и две текстовые метки Label, в которых будут отображаться дата и время. Затем нуж­но дважды щелкнуть на элементе DateTimePicker, чтобы задать код обработчика события Val ueChanged. Этот код приведен в листинге 3.27.

Листинг 3.27

private void dateTimePickerl_ValueChanged(object sender. EventArgs e)

{

1ЫDate. Text = "Дата: " +

dateTimePi ckerl. Value. ToShortDateStri ng(): lblTime. Text = "Время: " +

dateTimePickerl. Value. ToShortTimeString():

}

Внешний вид получившегося приложения показан на рис. 3.19.

[~ Bsnsffl >

XJ> 27,2001-1

Лата: 7/27/06 Время: 10:30 AM

Рис. 3.19. Выбор даты при помощи элемента DateTimePicker

В документации MSDN есть небольшая статья «How to: Use the DateTimePicker Class in the. NET Compact Framework», в которой приводится небольшой пример использования этого элемента. Под­держка данного элемента появилась и в смартфонах под управле­нием Windows Mobile 5.0. Но в этом случае внешний вид элемента будет несколько иным.

Элемент DocumentList

Новый элемент управления DocumentList, который появился в. NET Compact Framework 2.0, может заменить такие элементы, как SaveFi 1 eDi al од и OpenFi 1 eDi al og, так как имеет все необходимые сред­ства для работы с файлами. Помимо этого элемент DocumentLi st име­ет дополнительные возможности, которые наверняка понравятся разработчикам программ. Он позволяет очень просто реализовать

3-2873 основные задачи манипулирования файлами, к которым относятся копирование, удаление, переименование и перемещение файлов. С помощью этого элемента также можно сортировать файлы по име­ни, дате создания, размеру. Кроме того, существует даже возмож­ность посылать файлы по электронной почте или передавать на другое устройство при помощи инфракрасной связи.

Элемент DocumentLi st работает с файлами в пределах папки Му Documents, включая подпапки. Следует обратить внимание на то, что DocumentLi st является классом из пространства Mi crosoft. Wi ndowsCE. Forms и не является частью полной версии. NET Framework. Поэтому есть смысл поближе познакомиться с данным элементом.

Для разработки тестового приложения сначала потребуется создать новый проект, а затем переместить на форму элемент DocumentLi st. Для свойства Name надо задать значение DocListFile, свойство Dock должно получить значение Тор, свойству Heigth присваивается зна­чение 160, а для свойства Sel ectedDi rectory задается значение Му Documents.

Также на форме надо разместить элементы ComboBox и StatusBar. Элементу ComboBox надо присвоить имя cboFileType. Затем следует выбрать свойство Items и открыть окно редактора String Collection Editor. Для списка надо задать значения BMP и WAV.

Затем нужно дважды щелкнуть на элементе ComboBox, чтобы задать код обработчика события SelectedlndexChanged. Код обработчика приведен в листинге 3.28.

Листинг 3.28

private void cboFileType_SelectedIndexChanged(object sender. EventArgs e)

{

if (cboFileType. Text — "BMP")

{

docListFile. Filter = "Рисунки (*.bmp)|*.bmp"; docListFile. SelectedDirectory = "My Pictures";

}

el se {

docListFile. Filter * "Звуки (*.wav)|*.wav"; docListFile. SelectedDirectory = "My Music";

}

}

Данный код динамически меняет значение свойства Fi 1 ter элемен­та DocumentList для отображения файлов определенного типа. Так­же меняется папка просмотра файлов. Если пользователь выберет расширение. BMP, то следует выбрать папку My Pictures, специально предназначенную для хранения картинок. При выборе типа фай­лов. WAV выбирается папка My Music.

Теперь следует дважды щелкнуть на элементе DocumentList, чтобы создать обработчик события DocumentActi vated Соответствующий код приведен в листинге 3.29.

Листинг 3.29

private void docListFile_DocumentActivated(object sender,

Mi crosoft. Wi ndowsCE. Forms. DocumentLi stEventArgs e)

{

statusBarl. Text = e. Path;

// работа с выбранным файлом }

Перед началом тестирования стоит скопировать несколько соответ­ствующих файлов в папки My Pictures и My Music. После запуска про­граммы нужно перейти в поле со списком и выбрать тип файлов. После этого будет активирован элемент DocumentLi st с выбранной папкой. Из списка документов можно будет выбрать конкретный файл.

Следует обратить внимание на то, что выбранный файл имеет кон­текстное меню при помощи которого можно выполнять базовые операции с файлом (рис. 3.20). Путь к выбранному файлу отобра­жается в строке состояния.

Элементы управления

Элемент Notification

Еще один новый элемент управления, который появился в послед­ней версии. NET Compact Framework 2.0, носит имя Notification. Данный элемент управления позволяет отображать интерактив­ные сообщения. В документации по данному элементу приводит­ся довольно интересный пример с использованием HTML-текста. Но в книге можно ограничиться более наглядным примером.

Для создания тестового примера нужно переместить на форму эле­менты Notification и Button. При нажатии на кнопку необходимо отобразить соответствующее сообщение. Это реализуется при по­мощи кода, приведенного в листинге 3.30.

Листинг 3.30

private void buttonl_Click(object sender, EventArgs e)

{

notification!..Text = "Позвони родителям!": notificationl. Caption = "Демонстрация примера"; notі fі cationl. Critical = true;

// Уведомление висит на экране 10 секунд notificationl. InitialDuration = 10; notifі cationl. Visible = true;

}

На рис. 3.21 показано сообщение, которое будет отображаться на экране КПК в течение 10 секунд.

Элементы управления

Рис. 3.21. Вывод сообщения с помощью элемента Notification

ПРИМЕЧАНИЕ——————————————————————————

Элемент Notification применяется только в приложениях для кар­манных компьютеров. Смартфоны его не поддерживают

Элемент HardwareButton

На карманных компьютерах кроме клавиш навигации присутствуют также дополнительные кнопки, при помощи которых активируются часто запускаемые приложения. Как правило, в состав программного обеспечения КПК входит утилита, с помощью которой можно назна­чить каждой из этих кнопок определенные команды. Но можно пред­ставить ситуацию, когда для создаваемой игры нужно, чтобы управ­ление осуществлялось с помощью этих кнопок. Тогда необходимо переопределить на время поведение кнопок в вашем приложении. И сделать это можно с помощью элемента HardwareButton, который по­явился в. NET Compact Framework 2.0.

Следует рассмотреть пример использования этого нового элемента. Прежде всего нужно создать новый проект и поместить на панели Component tray два элемента HardwareButton с именами hrdLeftRotate и hrdRightRotate. Для каждой переопределяемой кнопки необходимо создать свой экземпляр элемента HardwareButton. В рассматриваемом примере будут переопределяться вторая и третья кнопки.

Также на форме надо разместить графическое поле PictureBox. В него надо загрузить любое изображение и растянуть картинку таким обра­зом, чтобы она заняла верхнюю половину экрана. Изображение надо пристыковать к верхней части формы. Для этого свойству Dock при­сваивается значение Тор. Также на форме надо разместить надпись Label, при помощи которой будут отображаться подсказки. Надпись следует пристыковать к нижней части формы. Для этого свойству Dock присваивается значение Bottom. У обоих добавленных элементов HardwareButton нужно отыскать свойство Associ atedControl и задать зна­чение Forml. Также надо изменить значения свойств HardwareKey. Для первого элемента применяется значение Appl icationKey2, что соответ­ствует второй кнопке. Для второго элемента задается значение Appl і cati опКеуЗ, что соответствует третьей кнопке под экраном. Теперь, когда все необходимые свойства установлены, нужно написать код для события Forml Keyllp. Код приведен в листинге 3.31.

Листинг 3.31

private void FormlJ_oad(object sender. EventArgs e)

{

label1.Text = "Нажмите вторую кнопку для поворота экрана на 90 градусов":

}

private void Forml_KeyUp(object sender, KeyEventArgs e)

^ продолжение iP


Листинг 3.31 (продолжение)

switch ((HardwareKeys)e. KeyCode)

{

case HardwareKeys. Applіcati onKey2:

if (SystemSettings. ScreenOrientation —

ScreenOri entati on. AngleO)

{

SystemSettі ngs. ScreenOri entati on =

ScreenOri entati on. Angle90: labell. Text * "Нажмите третью кнопку для поворота экрана в первоначальную позицию";

}

break;

case HardwareKeys. Applі cati опКеуЗ:

if (SystemSettіngs. ScreenOrientation ==

ScreenOri entati on. Angle90)

{

SystemSetti ngs. ScreenOri entati on *

ScreenOrientation. AngleO;

labell. Text = "Нажмите вторую кнопку для поворота экрана на 90 градусов";

}

break;

default:

break:

}

Элементы управления

Запустите программу и попытайтесь нажимать по очереди на вто­рую и третью кнопки под экраном карманного компьютера. Резуль­тат показан на рис. 3.22.

ПРИМЕЧАНИЕ——————————————————————————-

В документации говорится, что различные модели КПК имеют раз­личное число кнопок, причем не все из них поддерживаются на систем­ном уровне. Например, Windows Mobile2003для Pocket PC поддержива­ет четыре кнопки, a Windows Mobile 5.0 для Pocket PC поддерживает пять кнопок. При этом класс HardwareButton не поддерживается смартфонами и другими устройствами на базе Windows СЕ, которые не является устройствами Pocket PC.

Leave a reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Confirm that you are not a bot - select a man with raised hand: